从有序的数组中通过中间值来寻找最佳匹配。
例如:nums[2,4,5,6,7]中target为2,则先比较nums[(0+4)/2]与2的大小,若2小于该值则选择其值左边剩下的数组来筛选,大于则右边。

大致思路:
从数组中找出一个:

  1. let left = 1;
  2. let right = n;
  3. while(left < right){
  4. const mid = Math.floor(left + (right - left)/2);
  5. if(nums[mid]>=target)
  6. right = mid;
  7. else
  8. left = mid + 1 ;
  9. }
  10. return left;

找出target在数组中所应该在的位置。

题型一:

剑指 Offer 53 - II. 0~n-1中缺失的数字

image.png
思路:
运用二分来找目的值,当中间值索引所对应的值不等于索引时,说明前面发生了缺失,若等于,则说明后面发生了缺失

  1. var missingNumber = function(nums) {
  2. if(nums[0]!=0)return 0;
  3. let left = 0;
  4. let right = nums.length-1;
  5. while(left<=right){
  6. const mid = left + Math.floor((right-left)/2);
  7. if(nums[mid]==mid)left = mid+1;
  8. else right = mid-1;
  9. }
  10. return left;
  11. };

题型二:

剑指 Offer 11. 旋转数组的最小数字

image.png
思路:
运用二分,倘若中间值小于最右的值,则说明中间到右边的范围内可以忽略,若大于最右的值,则左边到中间+1的范围可以忽略。因为最右的是从最小值递增的最大值,大于最右则说明一定大于最小值,所以也可以忽略。
看官方解答或许更加可以理解。

  1. var minArray = function(numbers) {
  2. let left = 0;
  3. let right = numbers.length-1;
  4. while(left<right){
  5. const mid = left + Math.floor((right-left)/2);
  6. if(numbers[mid]<numbers[right])right = mid;
  7. else if(numbers[mid]>numbers[right])left = mid+1;
  8. else right -= 1;
  9. }
  10. return numbers[left];
  11. };