当前位置:网站首页>题解:在一个排序数组中查找元素第一个和最后一个的位置 (个人笔记)
题解:在一个排序数组中查找元素第一个和最后一个的位置 (个人笔记)
2022-07-29 05:09:00 【卷饼85】
题目
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
示例 1:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
示例 2:
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
示例 3:
输入:nums = [], target = 0
输出:[-1,-1]
提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109
nums 是一个非递减数组
-109 <= target <= 109
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array
解题思路
采用二分查找
因为给的数组是升序排序,所以采用常规的二分法,判断是否有与target相等的值
如果有,则通过i++,来从i->mid中进行循环找出第一个与target相等的数组值的下表i,找到后break;
再通过j–,来从mid->j中进行循环找出第一个与target相等的数组值的下表j,找到后break;
最后返回return {i,j};
如果以上都不满足,则返回return {-1,-1};
时间复杂度O(n^2)
代码
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int i = 0 , j = nums.size()-1,mid=0;
while(i<=j)
{
mid = i + (j-i)/2;
if(nums[mid]>target)j=mid-1;
else if(nums[mid]==target)
{
for(;i<=mid;i++)
{
if(nums[i]==target){
break;}
}
for(;j>=mid;j--)
{
if(nums[j]==target){
break;}
}
return {
i,j};
}
else i = mid+1;
}
return {
-1,-1};
}
};
优化:
经过分析,可以给定一个bool类型来判断,如果数组中存在nums[mid]==target;
则bool类型的值为真,否则为假;
然后将原本在while循环里的for放到while循环外边
这样时间复杂度就变为O(log2^n)
代码
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int i = 0 , j = nums.size()-1,mid=0;
bool k = false;
while(i<=j)
{
mid = i + (j-i)/2;
if(nums[mid]>target)j=mid-1;
else if(nums[mid]==target)
{
k = true;break;
}
else i = mid+1;
}
if(k)
{
for(;i<=mid;i++)
{
if(nums[i]==target){
break;}
}
for(;j>=mid;j--)
{
if(nums[j]==target){
break;}
}
return {
i,j};
}
return {
-1,-1};
}
};
边栏推荐
- Helm chart for Kubernetes
- 365天挑战LeetCode1000题——Day 042 数组序号转换 + 相对名次 离散化处理
- 京东云金秋上云特惠进行中!扫码参与活动
- 365天挑战LeetCode1000题——Day 039 完全二叉树插入器 + 寻找峰值 II + 快照数组
- QML custom tabbar
- 6.3 references
- Complete ecological map of R & D Efficiency & selection of Devops tools
- MFC集成qt验证及问题处理
- Unity3D - 物体太远看不见的问题
- 数千个数据库、遍布全国的物理机,京东物流全量上云实录 | 卓越技术团队访谈录
猜你喜欢

ARFoundation从零开始8-Geospatial API(地理空间)开发

QT系列---安装

Architecture analysis of three-tier project and parameter name injection of construction method

京东云分布式链路追踪在金融场景的最佳实践

阿里云架构师梁旭:MES on 云盒,助力客户快速构建数字工厂

QT series - Installation

QML control: combobox

510000 prize pool invites you to fight! The second Alibaba cloud ECS cloudbuild developer competition is coming

Xiaobai high salary shortcut Qt development game Snake
![[from_bilibili_DR_CAN][【Advanced控制理论】9_状态观测器设计][学习记录]](/img/9d/d9a4a3091c00ec65a9492ca49267db.png)
[from_bilibili_DR_CAN][【Advanced控制理论】9_状态观测器设计][学习记录]
随机推荐
Visual Basic .Net 如何获取命令参数
[event preview] cloud development, efficient and intelligent - the second Alibaba cloud ECS cloudbuild developer competition is about to start
[from_bilibili_DR_CAN][【Advanced控制理论】9_状态观测器设计][学习记录]
串口通讯部分详解
存储类别
Alibaba cloud architect Liang Xu: MES on cloud box helps customers quickly build digital factories
京东云分布式链路追踪在金融场景的最佳实践
ARFoundation入门教程7-url动态加载图像跟踪库
C语言 一级指针
Teardown's method of lifting the time limit
Qml类型:State 状态
C语言求字符串的长度
直播预告|如何节省30%人工成本,缩短80%商标办理周期?
阿里云架构师梁旭:MES on 云盒,助力客户快速构建数字工厂
分配内存:malloc()和free()
200 多家 ISV 入驻!阿里云计算巢发布一周年
C语言用指向指针的指针对n个整数排序
Webrtc audio anti weak network technology (Part 2)
2022年泰迪杯数据挖掘挑战赛C题方案及赛后总结
JD cloud golden autumn cloud special offer is in progress! Code scanning participation activities