给定一个按照升序排列的整数数组 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]

思路1:先用二分法找到其中某个target,再向前向后一位一位地找头和尾;

思路2:改进一下,在第二步找头和尾时也用二分法;

#include <iostream>
#include <vector>
using namespace std; vector<int> searchRange(vector<int>& nums, int target) {
vector<int> ans={-, -};
if(nums.size()==) return ans;
if(nums.size()==&&nums[]==target)
return {,};
if(nums.size()==&&nums[]!=target)
return ans;
int low=;
int high=nums.size()-;
int mid=;
while(low<=high)
{
mid=(low+high)/;
if(nums[mid]==target) break;
if(target<nums[mid]) high=mid-;
else low=mid+;
}
if(low>high) return ans; int begin=mid;
int end=mid; low=;
int m1=mid;
int m2;
while(low<=m1)
{
m2=(low+m1)/;
if(nums[m2]==target&&(m2-)>=&&nums[m2-]<target)
{
begin=m2;
break;
}
if(nums[m2]==target&&m2==)
{
begin=m2;
break;
}
if(nums[m2]<target&&(m2+)<=m1&&nums[m2+]==target)
{
begin=m2+;
break;
}
if(nums[m2]==target&&(m2-)>=&&nums[m2-]==target) m1=m2-;
if(nums[m2]<target&&(m2+)<nums.size()&&nums[m2+]<target) low=m2+;
} high=nums.size()-;
if((mid+)<nums.size()&&nums[mid+]==target)
{
m1=mid+;
}
else
return {begin,mid};
while(m1<=high)
{
m2=(m1+high)/;
if(nums[m2]==target&&(m2+)<nums.size()&&nums[m2+]>target)
{
end=m2;
break;
}
if(nums[m2]==target&&m2==nums.size()-)
{
end=m2;
break;
}
if(nums[m2]>target&&(m2-)>mid&&nums[m2-]==target)
{
end=m2-;
break;
}
if(nums[m2]==target&&(m2+)<nums.size()&&nums[m2+]==target) m1=m2+;
if(nums[m2]>target&&(m2-)>mid&&nums[m2-]>target) high=m2-;
}
return {begin,end};
} int main() {
vector<int> a={,,}; int target=;
vector<int> ans=searchRange(a,target);
std::cout << ans[]<<ans[]<< std::endl;
return ;
}

#leetcode刷题之路34-在排序数组中查找元素的第一个和最后一个位置的更多相关文章

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

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

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

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

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

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

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

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

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

    class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { ve ...

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

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

  7. 【LeetCode】在排序数组中查找元素的第一个和最后一个位置【三次二分】

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

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

  9. leetcode34. 在排序数组中查找元素的第一个和最后一个位置

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

  10. PHP-在排序数组中查找元素的第一个和最后一个位置

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

随机推荐

  1. Hbase-indexer常用命令

    1. 启动hbase-indexer服务 nohup ./hbase-indexer server -z s1:,s2:,s3:,s4:,s5: > /work/hbase-indexer.lo ...

  2. Batch Norm、Layer Norm、Weight Norm与SELU

    加速网络收敛——BN.LN.WN与selu 自Batch Norm出现之后,Layer Norm和Weight Norm作为Batch Norm的变体相继出现.最近又出来一个很”简单”的激活函数Sel ...

  3. 【Java】生成UUID

    import java.util.UUID; public class MainProcess { public static void main(String[] args) { UUID uuid ...

  4. C#中的三种timer

    转 https://blog.csdn.net/hoiven/article/details/51362582 如果你需要使用规律的时间间隔重复执行一些方法,最简单的方式是使用定时器(timer). ...

  5. PHP获取当前页面的URL地址

    本文出至:新太潮流网络博客 //获取域名或主机地址 blog.iinu.com.cn echo $_SERVER['HTTP_HOST']."<br>"; //获取网页 ...

  6. 需要警惕的linux命令

    Linux shell/terminal命令非常强大,即使一个简单的命令就可能导致文件夹.文件或者路径文件夹等被删除.为了避免这样的事情发生,我们应该时刻注意PHP代码&命令,今天为大家带来9 ...

  7. [WinCE | VS2008 | Solution] VS2008 building WinCE projects taking a long time

    1. Open C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.CompactFramework.Common.targets 2. Find pa ...

  8. my sql 下左连接 右链接、内连接等应用,INNER JOIN LEFT JOIN RIGHT JOIN

    1.数据准备 建两个表格: create table student (idstu int, namestu ) ); ,"张三")(,"李四"),(,&quo ...

  9. magento2 重置后台密码

    项目根目录:运行如下命令 bin/magento admin:user:create --admin-user="admin" --admin-password="123 ...

  10. Mosquitto安装调试实录

    1. 安装 以Centos 7.x为例,先安装依赖项(笔者使用阿里云资源,部分依赖项可能未列出): yum install gcc-c++ yum install openssl-devel yum ...