Skip to content

Commit aea0b3f

Browse files
author
Michael Sila
committed
Created Custom Filter for problems I think will get me better faster
1 parent 0e8c7c4 commit aea0b3f

7 files changed

+233
-4
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
* https://leetcode.com/problems/count-servers-that-communicate/
3+
*/
4+
class CountServersThatCanCommunicate {
5+
6+
fun countServers(grid: Array<IntArray>): Int {
7+
val rows = mutableMapOf<Int,MutableList<Pair<Int,Int>>>()
8+
val columns = mutableMapOf<Int,MutableList<Pair<Int,Int>>>()
9+
val validServers = mutableSetOf<Pair<Int,Int>>()
10+
for (i in grid.indices) {
11+
for (j in grid[0].indices) {
12+
if (grid[i][j] == 1) {
13+
rows.computeIfAbsent(i){ mutableListOf()}.add(Pair(i,j))
14+
columns.computeIfAbsent(j){ mutableListOf()}.add(Pair(i,j))
15+
}
16+
}
17+
}
18+
rows.values.filter { it.size > 1 }.forEach { validServers.addAll(it) }
19+
columns.values.filter { it.size > 1 }.forEach { validServers.addAll(it) }
20+
21+
return validServers.size
22+
23+
}
24+
25+
26+
27+
28+
29+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/**
2+
* https://leetcode.com/problems/count-sorted-vowel-strings/
3+
*/
4+
class CountSortedVowelStrings {
5+
6+
fun countVowelStrings(n: Int): Int {
7+
if (n == 1) {
8+
return 5
9+
}
10+
val vowelMap : MutableMap<Pair<Int,Char>,Int> = mutableMapOf()
11+
12+
val vowels = mutableListOf('a','e','i','o','u')
13+
14+
vowels.forEach { vowelMap[Pair(1,it)] = 1 }
15+
16+
for (i in 1 until n) {
17+
for (v in vowels) {
18+
val current = vowelMap[Pair(i,v)]!!
19+
when (v) {
20+
'a' -> {
21+
vowelMap[Pair(i+1,'a')] = vowelMap.getOrDefault(Pair(i+1,'a'),0)+current
22+
vowelMap[Pair(i+1,'e')] = vowelMap.getOrDefault(Pair(i+1,'e'),0)+current
23+
vowelMap[Pair(i+1,'i')] = vowelMap.getOrDefault(Pair(i+1,'i'),0)+current
24+
vowelMap[Pair(i+1,'o')] = vowelMap.getOrDefault(Pair(i+1,'o'),0)+current
25+
vowelMap[Pair(i+1,'u')] = vowelMap.getOrDefault(Pair(i+1,'u'),0)+current
26+
}
27+
'e' -> {
28+
vowelMap[Pair(i+1,'e')] = vowelMap.getOrDefault(Pair(i+1,'e'),0)+current
29+
vowelMap[Pair(i+1,'i')] = vowelMap.getOrDefault(Pair(i+1,'i'),0)+current
30+
vowelMap[Pair(i+1,'o')] = vowelMap.getOrDefault(Pair(i+1,'o'),0)+current
31+
vowelMap[Pair(i+1,'u')] = vowelMap.getOrDefault(Pair(i+1,'u'),0)+current
32+
}
33+
'i' -> {
34+
vowelMap[Pair(i+1,'i')] = vowelMap.getOrDefault(Pair(i+1,'i'),0)+current
35+
vowelMap[Pair(i+1,'o')] = vowelMap.getOrDefault(Pair(i+1,'o'),0)+current
36+
vowelMap[Pair(i+1,'u')] = vowelMap.getOrDefault(Pair(i+1,'u'),0)+current
37+
}
38+
'o' -> {
39+
vowelMap[Pair(i+1,'o')] = vowelMap.getOrDefault(Pair(i+1,'o'),0)+current
40+
vowelMap[Pair(i+1,'u')] = vowelMap.getOrDefault(Pair(i+1,'u'),0)+current
41+
}
42+
'u' -> {
43+
vowelMap[Pair(i+1,'u')] = vowelMap.getOrDefault(Pair(i+1,'u'),0)+current
44+
}
45+
}
46+
47+
}
48+
}
49+
50+
var sum = 0
51+
for (v in vowels) {
52+
sum+= vowelMap[Pair(n,v)]!!
53+
}
54+
return sum
55+
56+
}
57+
58+
59+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
class DeleteNodesAndReturnForest {
2+
3+
fun delNodes(root: TreeNode?, to_delete: IntArray): List<TreeNode?> {
4+
val toDelete = to_delete.toSet()
5+
val forestMap = mutableMapOf<Int,TreeNode>()
6+
if (root != null) {
7+
forestMap[root.`val`] = root
8+
}
9+
traverse(null,root,forestMap,toDelete,DIRECTION.NONE)
10+
return forestMap.values.toList()
11+
}
12+
13+
14+
private fun traverse(parent: TreeNode?, node: TreeNode?, forest: MutableMap<Int,TreeNode>, toDelete: Set<Int>, direction: DIRECTION ) {
15+
if (node == null) {
16+
return
17+
}
18+
if (toDelete.contains(node.`val`)) {
19+
if (parent != null) {
20+
if (direction == DIRECTION.LEFT) {
21+
parent.left = null
22+
}
23+
if (direction == DIRECTION.RIGHT) {
24+
parent.right = null
25+
}
26+
27+
}
28+
if (node.left != null) {
29+
forest[node.left!!.`val`] = node.left!!
30+
}
31+
if (node.right != null) {
32+
forest[node.right!!.`val`] = node.right!!
33+
}
34+
forest.remove(node.`val`)
35+
}
36+
37+
traverse(node,node.left,forest,toDelete,DIRECTION.LEFT)
38+
traverse(node,node.right,forest,toDelete,DIRECTION.RIGHT)
39+
}
40+
41+
42+
private enum class DIRECTION {
43+
NONE,
44+
LEFT,
45+
RIGHT
46+
}
47+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/**
2+
* https://leetcode.com/problems/filter-restaurants-by-vegan-friendly-price-and-distance/
3+
*/
4+
class FilterResturantsByFactors {
5+
6+
fun filterRestaurants(restaurants: Array<IntArray>, veganFriendly: Int, maxPrice: Int, maxDistance: Int): List<Int> {
7+
8+
return restaurants.filter {
9+
val validPrice = it[3] <= maxPrice
10+
val validDistance = it[4] <= maxDistance
11+
val validVegan = veganFriendly == 0 || it[2] == 1
12+
validDistance && validPrice && validVegan
13+
}
14+
.sortedWith(compareByDescending<IntArray> { it[1] }.thenByDescending{it[0]})
15+
.map { it[0] }
16+
}
17+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/**
2+
* https://leetcode.com/problems/lowest-common-ancestor-of-deepest-leaves/
3+
*/
4+
class LowestCommonAncestorOfDeepestLeaves {
5+
6+
fun lcaDeepestLeaves(root: TreeNode?): TreeNode? {
7+
if (root == null) {
8+
return null
9+
}
10+
val traversal = traverse(root,0)
11+
return traversal.first
12+
}
13+
14+
15+
16+
fun traverse(node: TreeNode? , depth: Int ) : Pair<TreeNode?,Int> {
17+
18+
if (node == null) {
19+
return Pair(null,depth)
20+
}
21+
if (node.left == null && node.right == null) {
22+
return Pair(node,depth)
23+
}
24+
if (node.left == null ) {
25+
return traverse(node.right!!,depth+1)
26+
}
27+
if (node.right == null) {
28+
return traverse(node.left!!,depth+1)
29+
}
30+
else {
31+
val rightTraverse = traverse(node.right!!,depth+1)
32+
val leftTraverse = traverse(node.left!!,depth+1)
33+
if (rightTraverse.second > leftTraverse.second) {
34+
return rightTraverse
35+
}
36+
else if (leftTraverse.second > rightTraverse.second) {
37+
return leftTraverse
38+
}
39+
else {
40+
return Pair(node,leftTraverse.second)
41+
}
42+
}
43+
44+
}
45+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* https://leetcode.com/problems/minimum-add-to-make-parentheses-valid/
3+
*/
4+
class MinimumToAddToMakeParenthesisValid {
5+
fun minAddToMakeValid(S: String): Int {
6+
var toAdd = 0
7+
val stack = mutableListOf<Char>()
8+
S.forEach {
9+
if (it == '(') {
10+
stack.add(0,it)
11+
}
12+
if (it == ')') {
13+
if (stack.isEmpty() || stack.first() != '(') {
14+
toAdd++
15+
}
16+
else {
17+
stack.removeAt(0)
18+
}
19+
}
20+
}
21+
return toAdd+stack.size
22+
}
23+
}

solutions/src/TestBed.kt

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,27 @@ import kotlin.time.measureTime
55
@ExperimentalTime
66
fun main(args: Array<String>) {
77
println(measureTime {
8-
val tester = MinimumDeletionCostToAvoidRepeatingLetters()
8+
val tester = DeleteNodesAndReturnForest()
9+
10+
911
val result = listOf(
10-
tester.minCost("abaac", intArrayOf(1,2,3,4,5)),
11-
tester.minCost("abc", intArrayOf(1,2,3)),
12-
tester.minCost("aabaa", intArrayOf(1,2,3,4,1))
12+
traverse1()
1313
)
1414
println(result)
1515

1616
})
1717

1818
}
1919

20+
private fun traverse1() : List<Int> {
21+
val tester = DeleteNodesAndReturnForest()
22+
val root = TreeNode(1)
23+
root.left = TreeNode(2)
24+
root.right = TreeNode(3)
25+
root.right!!.right = TreeNode(4)
26+
return tester.delNodes(root, intArrayOf(1,2)).map { it!!.`val` }
27+
}
28+
2029

2130

2231

0 commit comments

Comments
 (0)