【LeetCode】在排序数组中查找元素的第一个和最后一个位置【三次二分】
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
分析:
数组有序,要求时间复杂度是O(log N),可以联想到二分
先直接在整个数组中二分找target,假设没有找到,那么返回[-1,-1]即可
假设找到了target,位置索引是k,那么在区间[0,k-1],[k+1,n-1]都进行二分寻找target
两个区间寻找target只有四种结果:
假设两个区间找到了target的索引为k1和k3,第一次找到的target索引为k2
1)第一个区间找到,第二个区间没有找到,返回结果:[k1,k2]
2)第一个区间找到,第二个区间找到,返回结果:[k1,k3]
3)第一个区间没有找到,第二个区间找到,返回结果:[k2,k3]
4)第一个区间没有找到,第二个区间没有找到,返回结果:[k2,k2]
总结:先进行一次二分寻找目标值是否存在,然后分别在目标值的两边进行两次二分寻找左右端点
总共三次二分
时间复杂度:O(log N)
空间复杂度:O(1)
class Solution {
public: //二分函数
int f(vector<int>& v,int l,int h,int t,int flag)
{
int k1=INT_MAX;
int k3=INT_MIN;
while(l<=h)
{
int mid=(l+h)/2;
if(v[mid]==t)
{
if(flag==1)
k1=min(k1,mid);
else if(flag==3)
k3=max(k3,mid);
else if(flag==2)
return mid;
if(v[l]==t)
{
k1=min(k1,l);
k3=max(k3,l);
}
if(v[h]==t)
{
k1=min(k1,h);
k3=max(k3,h);
}
l++;//找到了也要继续找下去
h--;
}
else if(v[mid]>t)
{
h=mid-1;
}
else if(v[mid]<t)
{
l=mid+1;
}
}
if(flag==1&&k1!=INT_MAX)
return k1;
if(flag==3&&k3!=INT_MIN)
return k3;
return -1;
}
vector<int> searchRange(vector<int>& v, int t)
{
vector<int> ans;
int n=v.size();
int k2=f(v,0,n-1,t,2);//第一次二分判断target是否存在
if(k2==-1)
{
ans.push_back(-1);
ans.push_back(-1);
return ans;
}
//在target的两端各自进行一次二分确定左右区间端点值
int k1=f(v,0,k2-1,t,1);
int k3=f(v,k2+1,n-1,t,3); //根据二分结果确定结果区间
if(k1==-1)
ans.push_back(k2);
else
ans.push_back(k1);
if(k3==-1)
ans.push_back(k2);
else
ans.push_back(k3);
return ans;
}
};
【LeetCode】在排序数组中查找元素的第一个和最后一个位置【三次二分】的更多相关文章
- Java实现 LeetCode 34 在排序数组中查找元素的第一个和最后一个位置
在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n ...
- 【LeetCode】34. 在排序数组中查找元素的第一个和最后一个位置
34. 在排序数组中查找元素的第一个和最后一个位置 知识点:数组,二分查找: 题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置 ...
- 34、在排序数组中查找元素的第一个和最后一个位置 | 算法(leetode,附思维导图 + 全部解法)300题
零 标题:算法(leetode,附思维导图 + 全部解法)300题之(34)在排序数组中查找元素的第一个和最后一个位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: / ...
- Leetcode题目34.在排序数组中查找元素的第一个和最后一个位置(中等)
题目描述: 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标 ...
- 【LeetCode】34-在排序数组中查找元素的第一个和最后一个位置
题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值 ...
- LeetCode 34 - 在排序数组中查找元素的第一个和最后一个位置 - [二分][lower_bound和upper_bound]
给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...
- #leetcode刷题之路34-在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置.你的算法时间复杂度必须是 O(log n) 级别.如果数组中不存在目标值,返回 [-1 ...
- C#LeetCode刷题之#34-在排序数组中查找元素的第一个和最后一个位置(Find First and Last Position of Element in Sorted Array)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4970 访问. 给定一个按照升序排列的整数数组 nums,和一个目 ...
- [Swift]LeetCode34. 在排序数组中查找元素的第一个和最后一个位置 | Find First and Last Position of Element in Sorted Array
Given an array of integers nums sorted in ascending order, find the starting and ending position of ...
随机推荐
- Python【day 9】函数入门1
1.什么是函数 函数的概念:对功能或者动作的封装 函数的好处:避免重复代码 2.函数的定义 1.函数的定义 def 函数名(形参列表): 函数体(return) 2.函数的调用 函数名(实参列表) 3 ...
- 2019 博盾习言java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.博盾习言等公司offer,岗位是Java后端开发,因为发展原因最终选择去了博盾习言,入职一年时间了,也成为了面 ...
- 线程池---Day26
线程池思想概述 当我们要使用线程的时候就去创建一个线程时,虽然实现方便,但是会出现问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率, ...
- 结对编程作业(java实现)
项目成员:罗海屏.郑晓婷 一 .Github项目地址:https://github.com/ting9500/GNIT_Second 二.PSP表格 PSP2.1 Personal Software ...
- Python之request模块-基础用法
Request模块参考中文手册:https://requests.readthedocs.io/zh_CN/latest/ Request模块 1.查看pip已装包(模块)的安装信息(模块的路径.版本 ...
- sqlalchemy相关操作(ORM)
环境:python3.7,pycharm,mysql ORM(Object-Relational-Mapper) 对象关系映射(ORM)是一种允许您使用面向对象的范例从数据库查询和操作数据的技术,sq ...
- PAT 乙级 1047.编程团体赛 C++/Java
题目来源 编程团体赛的规则为:每个参赛队由若干队员组成:所有队员独立比赛:参赛队的成绩为所有队员的成绩和:成绩最高的队获胜. 现给定所有队员的比赛成绩,请你编写程序找出冠军队. 输入格式: 输入第一行 ...
- Codeforces D. The Sum of the k-th Powers(拉格朗日插值)
题目描述: The Sum of the k-th Powers time limit per test 2 seconds memory limit per test 256 megabytes i ...
- django 基础进阶ORM COOKIE
ORM: class Book(models.Model): title=models.CharFiled(max_length=32) 类-----------------表 # Book- ...
- django crm2
1.模糊查询 由于Q的可以传递字符串属性,可以进行拼接__contains 进行搜索 2.未报名筛选,未报名的存储在models的 enroll_status_choices中,存储的是 enroll ...