二分法模板

【推荐:】
二分查找的迭代Iterative写法(2)重点掌握 [ left, right ) 半开半闭区间
迭代写法 < . 若没找到,就有 target < left = right.

public static int binarySearch2(int[] nums, int target){
  int left = 0; 
  int right = nums.length;  // [ left, right )
  while (left < right){            // left = right  不执行
      int mid = (right - left) / 2 + left; 
      if(nums[mid] < target){    // [ mid + 1, right )
          left = mid+1 ;          
      } else if (nums[mid] > target ){    // [ left, mid ) 
          right = mid;  // 注意 right = mid
      } else {
          return mid;
      }
  }
  if(nums[left]==target)return left;
  return -1;
}

二分查找的迭代Iterative写法(1)掌握 [ left, right ] 闭区间
迭代写法 <= . 若没找到,就有 right < target < left (right + 1 = left)
java 二分法源代码采用的方法( Arrays.binarySearch() )

public static int binarySearch1(int[] nums, int target){
  int left = 0; 
  int right = nums.length -1;  // [ left, right ]
  while (left <= right){            // left <= right 
      int mid = (right - left) / 2 + left; 
      if(nums[mid] > target){     // [ left, mid -1 ]
          right = mid - 1;
          } else if (nums[mid] < target ){   // [ mid + 1, right ]
          left = mid +1;
          } else {
          return mid;
          }
  return -1;
}

Leecode 35. 二分法的模板。


public class Solution {
    /**
    * @param A an integer array sorted in ascending order
    * @param target an integer
    * @return an integer
    */
    public int findPosition(int[] nums, int target) {
        if (nums == null || nums.length == 0) {
            return -1;
        }
        int start = 0, end = nums.length - 1;
        while (start + 1 < end) {             //这里最关键:保证进入while循环的必须是至少有三个数。
            int mid = start + (end - start) / 2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) { //这里保证的是返回第一个相同值。
                start = mid;
            } else {
                end = mid;
            }
        }
        if (nums[start] == target) {
            return start;
        }
        if (nums[end] == target) {
            return end;
        }
        return -1;
    }
}

在有重复数据的情况下,上述模板返回的是第一个相同数的位置。
如要返回最后一个相同数位置,微调即可。

你可能感兴趣的:(二分法模板)