704.二分查找

题目

原题链接
在这里插入图片描述

思路:

​ 二分查找target,但是不太会写循环。。

题解:

1. 需要三个变量,left, middle, right
2. 初始化:middle = (left + right)/2
3. 比较middle的值、target的值,选择下一个查找区间
4. 直到left = right,跳出循环

在这里插入图片描述

代码:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size()-1;
        //int middle = left + (right - left) / 2; // 
        int middle = (left + right) / 2;		 // 这样执行时间会更快一点
        int ans = -1;	// 目标下标

        while (left <= right) {
            if (target == nums[middle]) {
                ans = middle;	// target和nums[middle]相等的时候,下标middle即为答案
                break;
            }
            else if (target > nums[middle]){
                left = middle+1;    //因为nums[middle]肯定不是target
                //middle = left + ((right - left) / 2);
                middle = (left + right) / 2;
            }
            else {
                right = middle-1;   //因为nums[middle]肯定不是target
                //middle = left + ((right - left) / 2);
                middle = (left + right) / 2;
            }
        }
        return ans;	// 返回结果
    }
};

Debug过程:

  1. while循环中直接比较targetmiddle

  2. 后面意识到了,想都没想,直接都改成nums[target]nums[middle]

  3. 一直奇怪的报错,才从这张图中发现target其实不是下标,因为输出了数字9,而不是9对应的下标,傻了傻了…还以为是middle的计算发生了溢出55在这里插入图片描述

  4. 修改之后,提交结果
    在这里插入图片描述

  5. 试了一下,middle是不是会发生溢出,就把middle改成了原来的写法,执行用时减少了!
    在这里插入图片描述

优化:

​ 1. 不用使用ans来表示结果,直接在while循环中return,循环外面return -1即可,因为循环外面肯定是没找见。

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1;

        while (left <= right) {
            int middle = (left + right) / 2;
            if (nums[middle] == target) {
                return middle;
            }
            else if (nums[middle] < target) {
                left = middle + 1;
            }
            else {
                right = middle - 1;
            }
        }
        return -1;
    }
};

但是好像优化了个寂寞,只是代码减少了。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值