leetcode34:在排序数组中查找元素的第一个和最后一个位置

题目链接:34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

复制代码
class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        if(nums.empty()) {
            return {-1, -1};
        }
        vector<int> ResultPos;
        int left = 0, right = nums.size() - 1;
        int first = -1, second = -1;
        while(left <= right)
        {
            int mid = left + (right - left) / 2;
            if(nums[mid] == target)
            {
                first = mid;
                right = mid - 1;
            } 
            else if(nums[mid] > target)
            {
                right = mid - 1;
            }
            else
            {
                left = mid + 1;
            }
        }

        left = 0, right = nums.size() - 1;
        while(left <= right)
        {
            int mid = left + (right - left) / 2;
            if(nums[mid] == target)
            {
                second = mid;
                left = mid + 1;
            }
            else if(nums[mid] > target)
            {
                right = mid - 1;
            }
            else
            {
                left = mid + 1;
            }
        }
        ResultPos.push_back(first);
        ResultPos.push_back(second);
        return ResultPos;
    }
};

这个代码让我对于二分法有了重新的认识,也就是假如说,以往找的都是数组中全都不同数的某一个数,而这个题目是数组中有相同的找第一个位置的。

我就拿查找某一个元素的第一个位置为例

复制代码
int left = 0, right = nums.size() - 1;
        int first = -1, second = -1;
        while(left <= right)
        {
            int mid = left + (right - left) / 2;
            if(nums[mid] == target)
            {
                first = mid;
                right = mid - 1;
            } 
            else if(nums[mid] > target)
            {
                right = mid - 1;
            }
            else
            {
                left = mid + 1;
            }
        }

这个代码我原本以为是只能找到中间就截止了,但其实我想过,while里面的条件就是left <= right

所以就算你找到了相同的元素,但是只要left <= right,那就不会停止搜索,所以让right往左移,找到第一个。这里讲一下为什么是right = mid - 1而不是left = mid + 1, 其实你想想,要是想找到前面的,是不是得需要一个指针往前走,那么这个也就是right = mid - 1;同理,想找到某一个元素的最后一个位置的话,那就得用left = mid + 1去找。

相关推荐
碧海银沙音频科技研究院1 小时前
基于ATS308X的无线语音交互对话功能实现
人工智能·嵌入式硬件·深度学习·算法
OKkankan1 小时前
python 进阶(三):面向对象进阶——从“会写 class”到设计可维护的后端对象
开发语言·数据结构·python
尹玉玺2 小时前
从原子残片到天道公理:以德谟克利特思想全貌,重新定界西方唯物认知的历史层级与边界
人工智能·算法·架构
青少儿编程课堂2 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:差分数组与区间修改实战解析
c++·python·算法·bfs·信息学竞赛
重生之小比特2 小时前
【算法拾光】二分查找|二分查找 + 再排序数组中查找元素的第一个和最后一个位置
算法·leetcode·职场和发展
文丑颜不良啊2 小时前
LeetCode76~100题目解析
java·leetcode
闻缺陷则喜何志丹2 小时前
vc入门宝典(九)
数据结构·list·mfc·存储·null·class
零基础1232 小时前
基于模型的强化学习与不基于模型的强化学习:核心区别与实战选择
python·算法
罗西的思考13 小时前
【Agentic RL】Dressage Staleness 控制深度分析
人工智能·算法·机器学习
quaer14 小时前
弗洛伊德算法--判圈法寻找环的入口O(n) O(1)
数据结构·算法