当前位置:网站首页>题解:在一个排序数组中查找元素第一个和最后一个的位置 (个人笔记)
题解:在一个排序数组中查找元素第一个和最后一个的位置 (个人笔记)
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};
}
};
边栏推荐
- QML定制TabBar
- QtCreator+CMake编译器设置
- 最新坦克大战2022-全程开发笔记-1
- C语言 N皇后问题
- CMU15-213 Shell Lab实验记录
- ARFoundation从零开始3-创建ARFoundation项目
- 510000 prize pool invites you to fight! The second Alibaba cloud ECS cloudbuild developer competition is coming
- 321,京东言犀×NLPCC 2022挑战赛开赛!
- osgSimplegl3例子分析
- Container security open source detection tool - veinmind (mirror backdoor, malicious samples, sensitive information, weak password, etc.)
猜你喜欢

The road to success in R & D efficiency of 1000 person Internet companies

数千个数据库、遍布全国的物理机,京东物流全量上云实录 | 卓越技术团队访谈录

GPIO的输入输出详解

【赛事预告】云上开发,高效智能——第二届阿里云ECS CloudBuild开发者大赛即将启动

More than 200 ISVs have settled in! The first anniversary of Alibaba cloud computing nest

OCCT学习003-----MFC单文档工程

Handwritten student management system

重定向和文件

365天挑战LeetCode1000题——Day 041 二分查找完结纪念 + 第 N 个神奇数字 + 在线选举

Come on! See how Clickhouse, which has risen 16 places a year, can be implemented in jd.com
随机推荐
365天挑战LeetCode1000题——Day 037 元素和小于等于阈值的正方形的最大边长 + 满足条件的子序列数目
CryEngine技术
Webrtc audio anti weak network technology (Part 2)
In depth analysis of common cross end technology stacks of app
容器安全开源检测工具--问脉 VeinMind(镜像后门、恶意样本、敏感信息、弱口令等)
预约中,2022京东云产业融合新品发布会线上开启
CMake 设置vs启动运行环境路径
Helm chart for Kubernetes
Getting started with arfoundation tutorial 10- plane detection and placement
AiTalk创始人梁宇淇:镜像连接虚拟与现实的纽带
365天挑战LeetCode1000题——Day 036 二叉树剪枝 + 子数组和排序后的区间和 + 删除最短的子数组使剩余数组有序
C语言文件操作
C语言数组典型应用代码详细讲解—高手误入(逐步代码详解)
【赛事预告】云上开发,高效智能——第二届阿里云ECS CloudBuild开发者大赛即将启动
分配内存:malloc()和free()
2022数学建模竞赛暑期培训讲座——最优化方法:目标规划
最新坦克大战2022-全程开发笔记-1
Xiaolu Inn - Trailer
存储类别
365天挑战LeetCode1000题——Day 038 公交站间的距离 + 基于时间的键值存储 + 转变数组后最接近目标值的数组和 + 有界数组中指定下标处的最大值