二分查找题目

本文探讨了二分查找在不同问题中的应用,包括数组、矩阵和旋转排序数组的搜索。通过实例展示了如何优化二分查找算法,解决寻找错误版本、搜索插入位置、查找元素范围等问题。同时,还涉及到了在峰值元素寻找和二维矩阵搜索中的应用策略。
摘要由CSDN通过智能技术生成

704. 二分查找easy
典型的二分查找,主要学习了更简洁高效的代码写法

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

278. 第一个错误的版本easy
35. 搜索插入位置easy
34. 在排序数组中查找元素的第一个和最后一个位置medium
33. 搜索旋转排序数组medium
思路:对于这样的一个数组,从中间分开要么是左边有序的,要么是右边有序的,所以说还是可以使用二分查找的,还有就是要注意条件判断了

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int sz=nums.size();
        int left=0;
        int right=sz-1;
        while(left<=right){
            int mid=left+(right-left)/2;
            if(nums[mid]==target)
                return mid;
            if(nums[0]<=nums[mid]){//左边有序,注意这里有等号,对应于right=left+1的情况
                if(nums[left]<=target&&target<nums[mid])//target在左面
                    right=mid-1;
                else
                    left=mid+1;
            }
            else{
                if(nums[mid]<target&&target<=nums[right])
                    left=mid+1;
                else
                    right=mid-1;
            }
        }
        return -1;
    }
};

74. 搜索二维矩阵medium
这道题我感觉是做过,但是提交后显示是第一次提交,
这个思路是从右上角开始,当前位置的值与目标值比较,根据结果向下或向左移动。
而使用二分查找的思路:
可以先找到可能包含目标值的那一行(也就是根据第一列元素使用二分查找找到第一个比目标值小的),再在那一列利用二分查找寻找是否包含目标元素
153. 寻找旋转排序数组中的最小值medium
就是在33搜索旋转数组的基础上,过程中保存有序序列最小值中的最小值,每次都舍弃有序的那一半序列即可
162. 寻找峰值medium
思路:因为是随便返回一个峰值就可以,所以,这道题可以一共看成就三种情况

  • 递增序列
  • 递减序列
  • 增到峰值再减

所以根据中间元素与后面紧跟的元素比较,判断nums[mid]处在增序列还是减序列上,来决定舍弃哪一半

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        int l=0;
        int r=nums.size()-1;
        while(l<r){
            int mid=l+(r-l)/2;
            if(nums[mid]<nums[mid+1])
                l=mid+1;
            else
                r=mid;
        }
        return l;//最后肯定是l==r才退出的循环,所以随便返回一个就可以
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值