【数据结构】 数组 | 二分查找法

142 阅读1分钟

leetcode 704. 二分查找 - 力扣(LeetCode)

image.png

解题思路:

思路问题改进
二分法左右区间更新left和right指针
while(left<right)什么时候停止更新left或者right指针的值==target
返回值存在返回下标,否则返回-1

代码:

// 写法一
class Solution {
    public int search(int[] nums, int target) {
        // [left,right) 左闭右开
        int len = nums.length;
        int left = 0;
        int right = len - 1 + 1;
        while(left < right) {
            int mid = (left + right) / 2;
            if(nums[mid] < target) {
                // update left
                left = mid + 1;
            }else if(nums[mid] > target) {
                // update right
                right = mid;
            }else {
                return mid;
            }
        }
        return -1;
    }
}

// 写法二
class Solution {
    public int search(int[] nums, int target) {
        // [left,right) 左闭右闭
        int len = nums.length;
        int left = 0;
        int right = len - 1;
        while(left <= right) {
            int mid = (left + right) / 2;
            if(nums[mid] < target) {
                // update left
                left = mid + 1;
            }else if(nums[mid] > target) {
                // update right
                right = mid - 1;
            }else {
                return mid;
            }
        }
        return -1;
    }
}

总结

  1. 二分查找法首先需要明确思路,即向接近值靠拢的更新规则

  2. 写代码时需要处理的问题是区间的边界,解决方法是抓住不变量,固定区间的左右边界条件(左闭右闭/左开右闭/左闭右开),选择其中一种即可