leetcode二分查找

LeetCodehot100-34. 在排序数组中查找元素的第一个和最后一个位置

复制代码
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) left=mid+1;
            else right=mid-1;
        }
        return left;
    }//[0, left-1] 中的所有元素都 < target
        //[right+1, n-1] 中的所有元素都 >= target
        //结束时 left = right + 1
    vector<int> searchRange(vector<int>& nums, int target) {
        int start=search(nums,target);
        if(start==nums.size()||nums[start]!=target) return {-1,-1};
        int end=search(nums,target+1)-1;//第一个 >= target+1 的位置,必然等于第一个 > target 的位置,
                                            //这个位置的前一个位置,就是最后一个 == target 的位置
        return {start,end};

    }
};

Leetcode162. 寻找峰值

复制代码
class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        int left=0,right=nums.size()-2;//// 假设 nums.size() = 5,索引 0-4 right = 3
                                        // 循环中 mid 最大为 3
                                        // mid+1 最大为 4,安全 ✓
        while(left<=right){
            int mid=left+(right-left)/2;
            if(nums[mid]>nums[mid+1]) right=mid-1;//明下坡,峰值在左侧(包括 mid)
            else left=mid+1;//说明上坡,峰值在右侧
        }
        return left;
    }
};

Leetcode153. 寻找旋转排序数组中的最小值

复制代码
class Solution {
public:
    int findMin(vector<int>& nums) {
        int left=0,right=nums.size()-2;//// 假设 nums.size() = 5,索引 0-4 right = 3
                                        // 循环中 mid 最大为 3
                                        // mid+1 最大为 4,安全 ✓
        while(left<=right){
            int mid=left+(right-left)/2;
            if(nums[mid]>nums[nums.size()-1]) left=mid+1; //mid 在左半部分(较大的部分),最小值在右边
            else right=mid-1;// mid 在右半部分(较小的部分),最小值在左边(包括 mid)
        }
        return nums[left];
    }
};

Leetcode33. 搜索旋转排序数组

两次二分查找

复制代码
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left=0,right=nums.size()-1,sz=right;
        while(left<=right){
            int mid=left+(right-left)/2;
            if(nums[mid]>nums[sz]) left=mid+1;
            else right=mid-1;
        }//此时left指向最小值的地方
       if (target > nums[sz]) {
        // target 在左半区 [0, left-1]
        right = left - 1;
        left = 0;
    } else {
        // target 在右半区 [left, sz]
        right = sz;
    }
        while(left<=right){
            int mid=left+(right-left)/2;
            if(nums[mid]==target) return mid;
            else if(nums[mid]<target) left=mid+1;
            else right=mid-1;
        }
        return -1;
    }
};
相关推荐
a1879272183127 分钟前
【算法】双指针与滑动窗口(二):滑动窗口——吃进、判定、吐出
算法·leetcode·双指针·滑动窗口·原理·模板·算法讲解
铭哥的编程日记29 分钟前
从一道 LeetCode Hard 到吃透一类题:加权区间调度「排序 + 二分 + DP」
算法·leetcode·职场和发展
Logic10132 分钟前
C语言/数据结构字符串题解:找出DNA序列中未配对的独特序列——排序+遍历(O(nlogn))
c语言·数据结构·字符串·数组·排序·时间复杂度·算法题
Navigator_Z1 小时前
LeetCode //C - 1248. Count Number of Nice Subarrays
c语言·算法·leetcode
wzdark1 小时前
基于链表的内存池设计与内存复用机制4
java·数据结构·链表
wzdark2 小时前
多维数组在算法设计中的存储映射问题4
算法
Phil3232 小时前
多智能体不是越多越好:Google《Towards a Science of Scaling Agent Systems》论文深度解读
算法
6Hzlia2 小时前
【Classic 150 刷题计划】 LeetCode 26. 删除有序数组中的重复项 | C++ 快慢双指针经典模板
c++·算法·leetcode
huang5791473 小时前
基于滑动窗口的流式数据算法优化思路3
算法
Ulyanov3 小时前
AudioVision Pro:基于 PySide6 + sounddevice 的实时音频可视化播放器设计
python·算法·音视频