
题解
二分法套路:
for (let i = 0; i < n; i++) {
if (isOK(i)) return ans;
}
连续的空间线性搜索,这就是二分查找可以发挥作用的标志。
const left = 最小可用;
const right = 最大可用;
while(left < right) {
const mid = Math.floor((left + right) / 2);
if(isOk(mid)) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
function shipWithinDays(weights: number[], D: number): number {let [left, right] = getMaxAndMin(weights);right += 1;while (left < right) {let mid = Math.floor((left + right) / 2);if (canFinish(weights, mid, D)) {right = mid;} else {left = mid + 1;}}return left;};function canFinish(weights: number[], weight: number, d: number) {let i: number = 0;for (let day = 0; day < d; day++) {let maxWeight = weight;while ((maxWeight -= weights[i]) >= 0) {// maxWeight -= weights[i];i++;if (i === weights.length) return true;}}return false;}function getMaxAndMin(weights: number[]) {let max = 0;let min = 0;for (let i of weights) {max += i;min = Math.max(min, i);}return [min, max];}
同理题!!!!!
题解
function minEatingSpeed(piles: number[], h: number): number {let left = 1;let right = getMax(piles) + 1;while (left < right) {let mid = Math.floor((right + left) / 2);if (canFinish(piles, mid, h)) {right = mid;} else {left = mid + 1;}}return left;};function canFinish(piles, speed, h): boolean {let time = 0;for (let i = 0; i < piles.length; i++) {time += timeOf(piles[i], speed);}return time <= h;}function timeOf(n, speed) {return Math.floor(n / speed) + ((n % speed) > 0 ? 1 : 0);}function getMax(piles) {let max = 0;for (let i = 0; i < piles.length; i++) {max = Math.max(max, piles[i]);}return max;}
