1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| class Solution { public int minCapability(int[] nums, int k) { int left = 0, right = 0; for (int x : nums) { right = Math.max(right, x); }
while (left + 1 < right) { int mid = (left + right) >>> 1; if (check(nums, k, mid)) { right = mid; } else { left = mid; } } return right; }
private boolean check(int[] nums, int k, int maxMoney) { if (nums.length == 1) { return (nums[0] <= maxMoney ? 1 : 0) >= k; } if (nums.length == 2) { if (nums[0] <= maxMoney || nums[1] <= maxMoney) { return 1 >= k; } else { return 0 >= k; } }
int[] dp = new int[nums.length];
dp[0] = nums[0] <= maxMoney ? 1 : 0; dp[1] = (nums[0] <= maxMoney || nums[1] <= maxMoney) ? 1 : 0; for (int i = 2; i < dp.length; i++) { if (nums[i] <= maxMoney) { dp[i] = Math.max(dp[i - 1], dp[i - 2] + 1); } else { dp[i] = dp[i - 1]; } }
return dp[dp.length - 1] >= k; } }
|