二分查找

49 阅读1分钟

算法题目笔记

数组

1.二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

  • 暴力解法

看到这道题目的最简单的思路就是 从头到尾遍历数组即可。

代码如下:

    class Solution {
      public int search(int[] nums, int target) {
      int res = -1;
      for (int i = 0; i < nums.length; i++) {
          if (nums[i] == target){
                res = i;
            }
        }
        return res;
    }
}

但是毫无疑问,上述解法的时间复杂度比较高,为O(n);

  • 二分解法

题意告知该数组是一个有序的数组,并且数组无重复元素,因为如果有重复的元素,使用二分法返回的下标可能不是唯一的,这道题满足上述条件,因此可以使用二分解法。

采用二分解法,即从中间开始扩散,通过递归每次缩小查找范围,过程中需要注意区间的定义,如果开始设置的是左闭右闭区间,那么之后递归后的每个区间都应该是左闭右闭区间。

代码如下:

  class Solution {
     public int search(int[] nums, int target) {
     int left = 0; 
     int right = nums.length - 1; // 定义target在左闭右闭的区间里,[left, right]
     while (left <= right){ //left==right,区间[left, right]依然有效,所以用 <=
         int mid = (left + right) / 2; 
         if (nums[mid] == target){
             return mid;
         }else if (nums[mid] < target){
             left = mid + 1; // target 在右区间,所以[middle + 1, right]
         }else {
             right = mid - 1; // target 在左区间,所以[left, middle - 1]
         }
     }
     return -1; // 未找到目标值
  }
}

二分解法的时间复杂度为O(log2n)