【算法】二分查找 力扣704

70 阅读1分钟

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

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9     
输出: 4       
解释: 9 出现在 nums 中并且下标为 4     

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2     
输出: -1        
解释: 2 不存在 nums 中因此返回 -1 

在写完之后,总是会出现“超出时间限制”,这个是因为下面代码第7行和第11行没有“-1”和“+1”,其实想想也知道,当nums[cetr] > target时,nums[cetr]大于查找值,所以下一次的查找范围是i到cetr - 1,而不是i到cetr。

示例:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int i = 0, j = nums.size()-1, cetr = (i+j)/2;
        while (i <= j) { 
            if (nums[cetr] > target) {
                j = cetr - 1; // 之前没有减一和加一,导致时间复杂度很高
                cetr = (i+j)/2;
            }
            else if(nums[cetr] < target) {
                i = cetr + 1; // 之前没有减一和加一,导致时间复杂度很高
                cetr = (i+j)/2;
            }
            else {
                return cetr;
            }
        }
        return -1;
    }
};