二分法模板

作者: 浩泽Hauser | 来源:发表于2019-01-20 09:40 被阅读0次

    【推荐:】
    二分查找的迭代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;
        }
    }
    
    

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

    相关文章

      网友评论

        本文标题:二分法模板

        本文链接:https://www.haomeiwen.com/subject/qexxjqtx.html