Skip to content

Commit 8b356d2

Browse files
More Problems
1 parent 1dd34c7 commit 8b356d2

File tree

4 files changed

+122
-2
lines changed

4 files changed

+122
-2
lines changed

solutions/src/ChampagneTower.kt

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/**
2+
* https://leetcode.com/problems/champagne-tower/
3+
*/
4+
class ChampagneTower {
5+
6+
fun champagneTower(poured: Int, query_row: Int, query_glass: Int): Double {
7+
val dp = mutableListOf<MutableList<Double>>()
8+
for (i in 0..query_row) {
9+
dp.add(mutableListOf())
10+
for (j in 0..i) {
11+
dp[i].add(0.0)
12+
}
13+
}
14+
dp[0][0] = poured.toDouble()
15+
dp.forEachIndexed { index,row ->
16+
if (index != dp.lastIndex) {
17+
row.forEachIndexed { index2, amount ->
18+
val newAmount : Double = if (amount > 1.0) {
19+
(amount-1.0)/2.0
20+
}
21+
else {
22+
0.0
23+
}
24+
dp[index+1][index2]+=newAmount
25+
dp[index+1][index2+1]+=newAmount
26+
}
27+
}
28+
29+
}
30+
return minOf(dp[query_row][query_glass],1.0)
31+
32+
}
33+
34+
}

solutions/src/CherryPickup.kt

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import java.util.*
2+
3+
4+
/**
5+
* https://leetcode.com/problems/cherry-pickup/
6+
*/
7+
class CherryPickup {
8+
fun cherryPickup(grid: Array<IntArray>): Int {
9+
val n = grid.size
10+
val dp = Array(n + 1) { Array(n + 1) { IntArray(n + 1) } }
11+
for (i in 0..n) {
12+
for (j in 0..n) {
13+
Arrays.fill(dp[i][j], Int.MIN_VALUE)
14+
}
15+
}
16+
dp[1][1][1] = grid[0][0]
17+
for (x1 in 1..n) {
18+
for (y1 in 1..n) {
19+
for (x2 in 1..n) {
20+
val y2 = x1 + y1 - x2
21+
if (dp[x1][y1][x2] > 0 || y2 < 1 || y2 > n || grid[x1 - 1][y1 - 1] == -1 || grid[x2 - 1][y2 - 1] == -1) {
22+
continue
23+
// have already detected || out of boundary || cannot access
24+
}
25+
val cur = Math.max(Math.max(dp[x1 - 1][y1][x2], dp[x1 - 1][y1][x2 - 1]), Math.max(dp[x1][y1 - 1][x2], dp[x1][y1 - 1][x2 - 1]))
26+
if (cur < 0) {
27+
continue
28+
}
29+
dp[x1][y1][x2] = cur + grid[x1 - 1][y1 - 1]
30+
if (x1 != x2) {
31+
dp[x1][y1][x2] += grid[x2 - 1][y2 - 1]
32+
}
33+
}
34+
}
35+
}
36+
return if (dp[n][n][n] < 0) 0 else dp[n][n][n]
37+
}
38+
39+
}
40+

solutions/src/TestBed.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ import kotlin.time.measureTime
33

44
fun main(args: Array<String>) {
55
println(measureTime {
6-
val tester = OutOfBoundsPaths()
6+
val tester = ChampagneTower()
77
val results = listOf(
8-
tester.findPaths(1,3,3,0,1)
8+
tester.champagneTower(1,1,1),
9+
tester.champagneTower(2,1,1)
910

1011
)
1112
println(results.map { it })

solutions/src/ThreeEqualParts.kt

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/**
2+
* https://leetcode.com/problems/three-equal-parts/
3+
*/
4+
class ThreeEqualParts {
5+
fun threeEqualParts(A: IntArray): IntArray? {
6+
var numOne = 0
7+
for (i in A) {
8+
if (i == 1) numOne++
9+
}
10+
val noRes = intArrayOf(-1, -1)
11+
if (numOne == 0) return intArrayOf(0, 2)
12+
if (numOne % 3 != 0) return noRes
13+
14+
//find index of starting 1 of third string
15+
var idxThird = 0
16+
var temp = 0
17+
for (i in A.indices.reversed()) {
18+
if (A[i] == 1) {
19+
temp++
20+
if (temp == numOne / 3) {
21+
idxThird = i
22+
break
23+
}
24+
}
25+
}
26+
val res1 = findEndIdx(A, 0, idxThird)
27+
if (res1 < 0) return noRes
28+
val res2 = findEndIdx(A, res1 + 1, idxThird)
29+
return if (res2 < 0) noRes else intArrayOf(res1, res2 + 1)
30+
}
31+
32+
//right is the pattern to compare to.
33+
//return EndIdx of left pattern that matches right side.
34+
private fun findEndIdx(A: IntArray, left: Int, right: Int): Int {
35+
var left = left
36+
var right = right
37+
while (A[left] == 0) left++
38+
while (right < A.size) {
39+
if (A[left] != A[right]) return -1
40+
left++
41+
right++
42+
}
43+
return left - 1
44+
}
45+
}

0 commit comments

Comments
 (0)