二分查找算法——寻找旋转排序数组中的最小值&点名

1.题目解析

题目来源:LCR173.点名------力扣

原名:剑指offer------0~n-1中消失的数字

测试用例

题目来源:153.寻找旋转排序数组中的最小值------力扣

测试用例

2.算法原理

点名

如果要寻找消失的数字,可以判断对应下标的数字是否和下标对应即可,根据这个定义可以将数据分为两段:规范段与不规范段

1.当mid指针落入不规范段,需要从右边缩小范围,因为mid可能直接指向结果,所以right只能更新到mid

2.当mid落入规范段,需要从左边缩小范围,可以将left直接更新为mid+1,不用担心遗漏数据

注意:如果缺少的是最后一个数字,需要特殊处理

细节:由于更新左右指针出现了mid+1,所以初始化mid时使用left+(right-left)/2即可,不用left+(right-left+1)/2,第二种使用的条件是更新左右指针出现mid-1
寻找旋转排序数组中的最小值

按照数组最后一个元素可以将数组分为两段,一段是大于最后一个元素的,另一段是小于最后一个元素的,即旋转上段与旋转下段

1.mid落入到旋转上段,说明最小值一定不在mid落入的一段,需要从左缩小范围,left可以更新为mid+1

2.mid落入旋转下段,说明最小值一定在mid落入的一段,需要从右边缩小范围,由于mid可能直接指向了结果,所以right只能更新到mid

细节:由于更新左右指针出现了mid+1,所以初始化mid时使用left+(right-left)/2即可,不用left+(right-left+1)/2,第二种使用的条件是更新左右指针出现mid-1

3.实战代码

点名

cpp 复制代码
class Solution {
public:
    int takeAttendance(vector<int>& records) 
    {
        int left = 0,right = records.size() - 1;
        while(left < right)
        {
            int mid = left + (right - left) / 2;
            //落入规范段
            if(records[mid] == mid)
            {
                left = mid + 1;
            }
            //落入不规范段
            else
            {
                right = mid;
            }
        }
        if(left == records[left])
        {
            return left + 1;
        }
        return left;
    }
};

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

cpp 复制代码
class Solution 
{
public:
    int findMin(vector<int>& nums) 
    {
        int left = 0,right = nums.size() - 1;
        while(left < right)
        {
            int mid = left + (right - left) / 2;
            //落入旋转上段
            if(nums[mid] > nums[nums.size() - 1])
            {
                left = mid + 1;
            }
            //落入旋转下段
            else
            {
                right = mid;
            }
        }

        return nums[left];
    }
};
相关推荐
靠沿3 分钟前
【递归、搜索与回溯算法】专题三——穷举vs暴搜vs深搜vs回溯vs剪枝
算法·机器学习·剪枝
香蕉鼠片3 分钟前
排序算法C++
c++·算法·排序算法
red_redemption3 分钟前
自由学习记录(157)
学习·pyenv管理python
森G4 分钟前
51、Move方式创建线程---------多线程
c++·qt
xiaoye-duck5 分钟前
《算法题讲解指南:优选算法-栈》--65.删除字符中的所有相邻重复项,66.比较含退格的字符串,67.基本计算器II,68.字符串解码,69.验证栈序列
c++·算法·
Q741_1475 分钟前
每日一题 力扣 3653. 区间乘法查询后的异或 I 模拟 数学 位运算 C++ 题解
c++·数学·算法·leetcode·力扣·模拟
橘子编程6 分钟前
编程语言全指南:从C到Rust
java·c语言·开发语言·c++·python·rust·c#
XiYang-DING7 分钟前
【LeetCode】102.二叉树的层序遍历
算法·leetcode·职场和发展
艾莉丝努力练剑8 分钟前
【Linux线程】Linux系统多线程(三):Linux线程 VS 进程,线程控制
java·linux·运维·服务器·c++·学习·ubuntu
徒 花10 分钟前
Python知识学习07
windows·python·学习