LeetCode 704.二分查找

123 阅读2分钟

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

704.二分查找

给定一个 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

提示:

  1. 你可以假设 nums 中的所有元素是不重复的。
  2. n 将在 [1, 10000]之间。
  3. nums 的每个元素都将在 [-9999, 9999]之间。

二、思路分析

二分法的难点主要体现在以下几个方面:

  1. 实现细节:二分法的实现需要考虑很多细节问题,如左右边界的确定、循环终止条件的设置、中间值的计算等等。这些细节问题如果处理不好,容易导致算法出现边界问题、死循环等错误。
  2. 边界问题:二分法需要通过不断缩小区间范围来逼近目标值,但如果边界条件设置不合理,就可能会导致算法失效。例如,如果左右边界的初始值不合理,可能会导致算法无法找到目标值,或者出现数组下标越界等问题。
  3. 复杂度分析:虽然二分法的时间复杂度很低,但是对于一些复杂的问题,例如带有多个变量的函数,二分法的复杂度分析可能会比较困难。这时候需要对问题进行抽象,找到问题的瓶颈所在,再结合二分法的特点进行分析。
  4. 应用场景:二分法并不是所有问题都适用的算法,有些问题可能需要其他算法来解决。因此,在应用二分法时,需要根据问题的特点和算法的优势进行合理的选择。

三、AC代码

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left=0,right=nums.size()-1;
        while(left<=right){
            int mid=left+(right-left)/2;
            if(nums[mid]>target){
                right=--mid;

            }
            else if(nums[mid]<target){
                left=++mid;
            }
            else{
                return mid;
            }
        }
        return -1;
    }
};

四、总结

二分法虽然看起来简单,但是在实际应用中还是有很多需要注意的地方。需要仔细分析问题、合理设计算法,才能得到正确的结果。