给定一个按照升序排列的整数数组 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:改进一下,在第二步找头和尾时也用二分法;

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. vector<int> searchRange(vector<int>& nums, int target) {
  6. vector<int> ans={-, -};
  7. if(nums.size()==) return ans;
  8. if(nums.size()==&&nums[]==target)
  9. return {,};
  10. if(nums.size()==&&nums[]!=target)
  11. return ans;
  12. int low=;
  13. int high=nums.size()-;
  14. int mid=;
  15. while(low<=high)
  16. {
  17. mid=(low+high)/;
  18. if(nums[mid]==target) break;
  19. if(target<nums[mid]) high=mid-;
  20. else low=mid+;
  21. }
  22. if(low>high) return ans;
  23.  
  24. int begin=mid;
  25. int end=mid;
  26.  
  27. low=;
  28. int m1=mid;
  29. int m2;
  30. while(low<=m1)
  31. {
  32. m2=(low+m1)/;
  33. if(nums[m2]==target&&(m2-)>=&&nums[m2-]<target)
  34. {
  35. begin=m2;
  36. break;
  37. }
  38. if(nums[m2]==target&&m2==)
  39. {
  40. begin=m2;
  41. break;
  42. }
  43. if(nums[m2]<target&&(m2+)<=m1&&nums[m2+]==target)
  44. {
  45. begin=m2+;
  46. break;
  47. }
  48. if(nums[m2]==target&&(m2-)>=&&nums[m2-]==target) m1=m2-;
  49. if(nums[m2]<target&&(m2+)<nums.size()&&nums[m2+]<target) low=m2+;
  50. }
  51.  
  52. high=nums.size()-;
  53. if((mid+)<nums.size()&&nums[mid+]==target)
  54. {
  55. m1=mid+;
  56. }
  57. else
  58. return {begin,mid};
  59. while(m1<=high)
  60. {
  61. m2=(m1+high)/;
  62. if(nums[m2]==target&&(m2+)<nums.size()&&nums[m2+]>target)
  63. {
  64. end=m2;
  65. break;
  66. }
  67. if(nums[m2]==target&&m2==nums.size()-)
  68. {
  69. end=m2;
  70. break;
  71. }
  72. if(nums[m2]>target&&(m2-)>mid&&nums[m2-]==target)
  73. {
  74. end=m2-;
  75. break;
  76. }
  77. if(nums[m2]==target&&(m2+)<nums.size()&&nums[m2+]==target) m1=m2+;
  78. if(nums[m2]>target&&(m2-)>mid&&nums[m2-]>target) high=m2-;
  79. }
  80. return {begin,end};
  81. }
  82.  
  83. int main() {
  84. vector<int> a={,,};
  85.  
  86. int target=;
  87. vector<int> ans=searchRange(a,target);
  88. std::cout << ans[]<<ans[]<< std::endl;
  89. return ;
  90. }

#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. CVE-2018-10945 mongoose越界访问

    Hello , I found a vulneratility in mg_handle_cgi function The function is in mongoose.c , line 8925  ...

  2. linux rpm之已安装包校验、rpm包中文件提取

    已安装包校验 rpm -V 已安装的包名-V 校验指定rpm包中的文件 rpm -V pth没有任何提示,说明自安装后没有做过任何修改 rpm包中文件提取 比如对一个系统配置文件误操作,可以根据这个文 ...

  3. EF增删查改基类

    /// <summary> /// EF DAL CURD基类 /// </summary> /// <typeparam name="T">& ...

  4. JVM知识(一):基础原理

    学过java知识和技术人,都应该听说过jvm,jvm一直是java知识里面晋级阶段的重要部分,如果想要在java技术领域更深入一步,jvm是必须需要明白的知识点. 本篇来讲解jvm的基础原理,先来熟悉 ...

  5. DROP语句总结

    一.基本语句 通过使用 DROP 语句,可以轻松地删除索引.表和数据库.  1.DROP INDEX 语句 DROP INDEX 语句用于删除表中的索引. <!--用于 MS Access 的 ...

  6. Oracle EBS PO退货失败

    无法读取例程 &ROUTINE 中配置文件选项 INV_DEBUG_TRACE 的值. 系统-配置文件-地点层 INC%调试%踪 是 select *  from po_interface_e ...

  7. Oracle 处理坏块

    本文主要介绍如何去处理在Oracle数据库中出现坏块的问题,对于坏块产生在不同的对象上,处理的方法会有所不同,本文将大致对这些方法做一些介绍.因为数据库运行时间长了,由于硬件设备的老化,出现坏块的几率 ...

  8. React:组件的生命周期

    在组件的整个生命周期中,随着该组件的props或者state发生改变,其DOM表现也会有相应的变化.一个组件就是一个状态机,对于特定地输入,它总返回一致的输出. 一个React组件的生命周期分为三个部 ...

  9. 显示iOS所有系统字体

    显示iOS所有系统字体 源码地址: https://github.com/YouXianMing/UI-Component-Collection 效果图: 便于你开发中寻找适合自己的字体, demo中 ...

  10. 转:linux的fatab文件详解

    /etc/fstab是用来存放文件系统的静态信息的文件.位于/etc/目录下,可以用命令less /etc/fstab 来查看,如果要修改的话,则用命令 vi /etc/fstab 来修改. 当系统启 ...