image.png

题解

二分法套路:
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;

  1. function shipWithinDays(weights: number[], D: number): number {
  2. let [left, right] = getMaxAndMin(weights);
  3. right += 1;
  4. while (left < right) {
  5. let mid = Math.floor((left + right) / 2);
  6. if (canFinish(weights, mid, D)) {
  7. right = mid;
  8. } else {
  9. left = mid + 1;
  10. }
  11. }
  12. return left;
  13. };
  14. function canFinish(weights: number[], weight: number, d: number) {
  15. let i: number = 0;
  16. for (let day = 0; day < d; day++) {
  17. let maxWeight = weight;
  18. while ((maxWeight -= weights[i]) >= 0) {
  19. // maxWeight -= weights[i];
  20. i++;
  21. if (i === weights.length) return true;
  22. }
  23. }
  24. return false;
  25. }
  26. function getMaxAndMin(weights: number[]) {
  27. let max = 0;
  28. let min = 0;
  29. for (let i of weights) {
  30. max += i;
  31. min = Math.max(min, i);
  32. }
  33. return [min, max];
  34. }

同理题!!!!!

image.png

题解

  1. function minEatingSpeed(piles: number[], h: number): number {
  2. let left = 1;
  3. let right = getMax(piles) + 1;
  4. while (left < right) {
  5. let mid = Math.floor((right + left) / 2);
  6. if (canFinish(piles, mid, h)) {
  7. right = mid;
  8. } else {
  9. left = mid + 1;
  10. }
  11. }
  12. return left;
  13. };
  14. function canFinish(piles, speed, h): boolean {
  15. let time = 0;
  16. for (let i = 0; i < piles.length; i++) {
  17. time += timeOf(piles[i], speed);
  18. }
  19. return time <= h;
  20. }
  21. function timeOf(n, speed) {
  22. return Math.floor(n / speed) + ((n % speed) > 0 ? 1 : 0);
  23. }
  24. function getMax(piles) {
  25. let max = 0;
  26. for (let i = 0; i < piles.length; i++) {
  27. max = Math.max(max, piles[i]);
  28. }
  29. return max;
  30. }