算法练习:34. 在排序数组中查找元素的第一个和最后一个位置

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

在这里我们可以用暴力的解法:就是一次判断,第一次遇见的元素==target,和最后一次遇见的,就保存起来

但是这样暴力解法时间复杂度为O(N)。时间复杂度超出了题目意思。

优化解法:因为数组是有序的,我们可以根据二分查找思想来进行解决,

利用二短性来进行,左右分段来查询边界

思路画图所示:

cpp 复制代码
class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int left1 = 0, left2 = 0, right1 = nums.size() - 1, right2 = nums.size() - 1;
        if (right1 < 0) return { -1,-1 }; //当是空数组时,right会小于0,这时直接退出就行
        while (left1 < right1)//不能等于,如果等于就会,一直right1 = mid1死循环
        {
            int mid1 = left1 + (right1 - left1) / 2;//优先左取整
            if (nums[mid1] < target) left1 = mid1 + 1;
            else if (nums[mid1] >= target) right1 = mid1;
        }
        while (left2 < right2)
        {
            int mid2 = left2 + (right2 - left2 + 1) / 2;//优先右取整
            if (nums[mid2] <= target) left2 = mid2;
            else if (nums[mid2] > target) right2 = mid2 - 1;
        }
        if (nums[right1] != target && nums[left2] != target) return { -1,-1 };//最后判断所处位置如果不是target,肯定不存在,直接返回
        return { right1,left2 };
    }
};
相关推荐
祖力551 小时前
数据结构的基本概念与单向链表(链表数据类型构造、创建、头插、尾插、头删、尾删)
数据结构·链表
大明者省2 小时前
WSL2 Ubuntu22.04 GPU训练环境配置指南
人工智能·算法·计算机视觉
白狐_7984 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2584 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
ShineWinsu4 小时前
对于C++:C++11中lambda、function、bind的解析
c++·面试·笔试·开发·lambda·bind·function
码匠许师傅4 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
Shell运维手记5 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
杨航 AI5 小时前
O(n log n):线性对数原理拆解 这个是排序算法的黄金复杂度之一。
算法·排序算法
船厂电气自动化ai大模型5 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
旖旎夜光5 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口