给定一个按照升序排列的整数数组 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】在排序数组中查找元素的第一个和最后一个位置【三次二分】的更多相关文章

  1. Java实现 LeetCode 34 在排序数组中查找元素的第一个和最后一个位置

    在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n ...

  2. 【LeetCode】34. 在排序数组中查找元素的第一个和最后一个位置

    34. 在排序数组中查找元素的第一个和最后一个位置 知识点:数组,二分查找: 题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置 ...

  3. 34、在排序数组中查找元素的第一个和最后一个位置 | 算法(leetode,附思维导图 + 全部解法)300题

    零 标题:算法(leetode,附思维导图 + 全部解法)300题之(34)在排序数组中查找元素的第一个和最后一个位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: / ...

  4. Leetcode题目34.在排序数组中查找元素的第一个和最后一个位置(中等)

    题目描述: 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标 ...

  5. 【LeetCode】34-在排序数组中查找元素的第一个和最后一个位置

    题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值 ...

  6. LeetCode 34 - 在排序数组中查找元素的第一个和最后一个位置 - [二分][lower_bound和upper_bound]

    给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...

  7. #leetcode刷题之路34-在排序数组中查找元素的第一个和最后一个位置

    给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置.你的算法时间复杂度必须是 O(log n) 级别.如果数组中不存在目标值,返回 [-1 ...

  8. C#LeetCode刷题之#34-在排序数组中查找元素的第一个和最后一个位置(Find First and Last Position of Element in Sorted Array)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4970 访问. 给定一个按照升序排列的整数数组 nums,和一个目 ...

  9. [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 ...

随机推荐

  1. 2019 蓝鲸人java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.蓝鲸人等公司offer,岗位是Java后端开发,因为发展原因最终选择去了蓝鲸人,入职一年时间了,也成为了面试官 ...

  2. 通过Nginx获取用户真实IP

    nginx配置 location / { proxy_set_header Host $host; proxy_set_header X-real-ip $remote_addr; proxy_set ...

  3. 如何才能通俗易懂的解释js里面的‘闭包’?

    1. "闭包就是跨作用域访问变量." [示例一] var name = 'wangxi' function user () { // var name = 'wangxi' fun ...

  4. Solr搜索器的特性及相关操作

    一.搜索处理器简介 所有的请求处理器都实现一个Java类,本例实现了solr.SearchHandler.在运行时,solr.SearchHandler被解析为内置的Solr类org.apache.s ...

  5. nginx之旅(第二篇):nginx日志管理、nginx防盗链、nginx虚拟主机

    一.nginx日志管理 Nginx访问日志主要有两个参数控制 1) log_format #用来定义记录日志的格式(可以定义多种日志格式,取不不同名字即可) log_format log_name s ...

  6. Ubuntu拒绝root用户ssh远程登录

    sudo vim /etc/ssh/sshd_config 找到并用#注释掉这行:PermitRootLogin prohibit-password 新建一行 添加:PermitRootLogin y ...

  7. kibana自动创建索引

    一般索引按月.季或年为单位创建索引.我这里写成logstash-www-2019-03,www是URL的二级域名.格式类型完全根据自己方便就行. 当ELK集群中的索引过多时,我这里有100多个不同的日 ...

  8. 【转】Pandas学习笔记(七)plot画图

    Pandas学习笔记系列: Pandas学习笔记(一)基本介绍 Pandas学习笔记(二)选择数据 Pandas学习笔记(三)修改&添加值 Pandas学习笔记(四)处理丢失值 Pandas学 ...

  9. JS三座大山再学习 ---- 原型和原型链

    本文已发布在西瓜君的个人博客,原文传送门 ## 前言 西瓜君之前学习了JS的基础知识与三座大山,但之后工作中没怎么用,印象不太深刻,这次打算再重学一下,打牢基础.冲鸭~~ 原型模式 JS实现继承的方式 ...

  10. Bootstrap基础学习 ---- 系列文章

    [Bootstrap基础学习]05 Bootstrap学习总结 [Bootstrap基础学习]04 Bootstrap的HTML和CSS编码规范 [Bootstrap基础学习]03 Bootstrap ...