二分查找的三种实现方式

  1. /**
  2. * @description : 二分查找,正常查找
  3. * @return {*} 找到返回该位置,找不到返回-1
  4. * @param {*} arr 传入的数组
  5. * @param {*} val 要查找的值
  6. */
  7. let binarySearch = function (arr, val) {
  8. if (arr.length === 0) {
  9. return -1;
  10. }
  11. let left = 0;
  12. let right = arr.length - 1;
  13. while (left <= right) {
  14. let mid = left + Math.floor((right - left) / 2);
  15. if (arr[mid] == val) {
  16. return mid;
  17. } else if (arr[mid] < val) {
  18. left = mid + 1;
  19. } else {
  20. right = mid - 1;
  21. }
  22. }
  23. return -1;
  24. };
  25. /**
  26. * @description : 二分查找,左侧区间,[0,arr.length)
  27. * 子区间:[left,mid) [mid+1,right)
  28. * @return {*} 返回left,就是查找的最左位置,找不到返回0
  29. * @param {*} arr
  30. * @param {*} val
  31. */
  32. let binarySearchLeft = function (arr, val) {
  33. if (arr.length === 0) {
  34. return -1;
  35. }
  36. let left = 0;
  37. let right = arr.length;
  38. while (left < right) {
  39. let mid = left + Math.floor((right - left) / 2);
  40. if (arr[mid] < val) {
  41. left = mid + 1;
  42. } else if (arr[mid] > val) {
  43. right = mid;
  44. } else if (arr[mid] == val) {
  45. right = mid;
  46. }
  47. }
  48. return left;
  49. }
  50. /**
  51. * @description : 二分查找,右侧区间,[0,arr.length)
  52. * 子区间:[left,mid) [mid+1,right)
  53. * @return {*} 返回left-1,就是查找的最右位置,找不到返回0
  54. * @param {*} arr
  55. * @param {*} val
  56. */
  57. let binarySearchRight = function (arr, val) {
  58. if (arr.length === 0) {
  59. return -1;
  60. }
  61. let left = 0;
  62. let right = arr.length;
  63. while (left < right) {
  64. let mid = left + Math.floor((right - left) / 2);
  65. if (arr[mid] <= val) {
  66. left = mid + 1;
  67. } else if (arr[mid] > val) {
  68. right = mid;
  69. } else if (arr[mid] == val) {
  70. left = mid + 1;
  71. }
  72. }
  73. return left - 1;
  74. }
  75. let arr = [1, 5, 8, 9, 9, 9, 9, 11];
  76. let res = binarySearch(arr, 9);
  77. let res2 = binarySearchLeft(arr, 9);
  78. let res3 = binarySearchRight(arr, 9);
  79. console.log(res); // 3
  80. console.log(res2); // 3
  81. console.log(res3); // 6

吃香蕉

image-20210424221734942.png
在JS中(right - left) / 2得到的可以是小数,这与Java中不同,因此要Math.floor(……)

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

运包裹

image-20210425085636375.png

  1. /**
  2. * @param {number[]} weights
  3. * @param {number} D
  4. * @return {number}
  5. */
  6. var shipWithinDays = function (weights, D) {
  7. let low = maxDays(weights);
  8. let high = sum(weights) + 1;
  9. while (low < high) {
  10. let mid = low + Math.floor((high - low) / 2);
  11. if (canFinish(weights, D, mid)) {
  12. high = mid;
  13. } else {
  14. low = mid + 1;
  15. }
  16. }
  17. return low - 1;
  18. };
  19. let canFinish = function (weights, D, carry) {
  20. let j = 0;
  21. for (let i = 0; i < D; i++) {
  22. let cap = carry;
  23. while (weights[j] < cap) {
  24. cap = cap - weights[j];
  25. j++;
  26. }
  27. }
  28. if (j == weights.length) {
  29. return true;
  30. } else {
  31. return false;
  32. }
  33. }
  34. let sum = function (weights) {
  35. let sum = 0;
  36. for (let w of weights) {
  37. sum = sum + w;
  38. }
  39. return sum;
  40. }
  41. let maxDays = function (weights) {
  42. let max = -Infinity;
  43. for (let w of weights) {
  44. if (w > max) {
  45. max = w;
  46. }
  47. }
  48. return max;
  49. }