diff --git a/src/main/java/com/dota/binarySearch/_1642/Solution.java b/src/main/java/com/dota/binarySearch/_1642/Solution.java new file mode 100644 index 0000000..b2a3dcc --- /dev/null +++ b/src/main/java/com/dota/binarySearch/_1642/Solution.java @@ -0,0 +1,27 @@ +package com.dota.binarySearch._1642; + +import java.util.PriorityQueue; + +class Solution { + public int furthestBuilding(int[] heights, int bricks, int ladders) { + var p = new PriorityQueue((a, b) -> b - a); + int n = heights.length; + for (int i = 1; i < n; i++) { + var diff = heights[i] - heights[i - 1]; + if (diff <= 0) continue; + + p.offer(diff); + if (bricks >= diff) { + bricks -= diff; + } else if (ladders > 0) { + ladders--; + bricks += p.poll(); + bricks -= diff; + if (bricks < 0) return i - 1; + } else { + return i - 1; + } + } + return n - 1; + } +} \ No newline at end of file diff --git a/src/main/java/com/dota/binarySearch/_1802/Solution.java b/src/main/java/com/dota/binarySearch/_1802/Solution.java new file mode 100644 index 0000000..390183a --- /dev/null +++ b/src/main/java/com/dota/binarySearch/_1802/Solution.java @@ -0,0 +1,32 @@ +package com.dota.binarySearch._1802; + +class Solution { + public int maxValue(int n, int index, int maxSum) { + int l = 1, r = maxSum + 1; + while (l + 1 < r) { + int mid = l + (r - l) / 2; + if (check(n, index, maxSum, mid)) { + l = mid; + } else { + r = mid; + } + } + return l; + } + + boolean check(int n, int index, int maxSum, int k) { + long sum = 0; + int l = Math.max(0, index - k + 1); + sum += (long) (k + k - (index - l)) * (index - l + 1) / 2; + if (l > 0) { + sum += l; + } + int r = Math.min(index + k - 1, n - 1); + sum += (long) (k + k - (r - index)) * (r - index + 1) / 2; + if (r < n - 1) { + sum += n - r - 1; + } + sum -= k; + return sum <= maxSum; + } +} \ No newline at end of file