高频刷题-704. Binary Search

高频刷题-704. Binary Search

https://leetcode.com/problems/binary-search/

二分查找,没啥好说的,就是一个left,一个right,和一个pivot去判断当前的target是在哪个范围内。值得注意的是取平均数pivot = (left + right) / 2,这句如果left + right有可能会溢出(超过int所能表示的最大值)。那么可以改成left + (right - left) / 2,或者(left + right) >>> 1。

至于left + (right - left) / 2为什么可以保证不溢出,这里有推导过程:

根据定义,left < right。

结果是right - left > 0和left + (right - left) = right(遵循基本代数)。

因此是left + (right - left) / 2 <= right。因此,由于操作的每个步骤都受right的值限制,因此不会发生溢出。

相比之下,考虑原表达式(left + right) / 2。 left + right >= right,并且由于我们不知道left和right的值,因此该值很可能溢出。

public int search(int[] nums, int target) {
        int pivot;
        int left = 0;
        int right = nums.length - 1;
        
        while (left <= right) {
            pivot = (left + right) / 2; // 改行可能有bug,使用 left + (right - left) / 2 或者 (left + right) >>> 1
            if (nums[pivot] == target) return pivot;
            
            else if (nums[pivot] < target) left = pivot + 1;
            else right = pivot - 1;   
        }
        
        return -1;
    }

 

上一篇:排序


下一篇:快速排序