首页 > 编程语言 > 详细

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

时间:2019-11-01 14:50:16      阅读:102      评论:0      收藏:0      [点我收藏+]

题目描述:

给定一个按照升序排列的整数数组 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 class Solution {
 2 public:
 3     vector<int> searchRange(vector<int>& nums, int target) {
 4 
 5         vector<int> ret;
 6         int n = nums.size();
 7         int first = -1;
 8         int l = 0;
 9         int r = n-1;
10         while(l<=r)//如果用一个过程,同时找两个边界,当遇到等于目标时左右扫描找边界
11         {          //这种算法当数组全等于目标时就退化成线性算法而不是o(logn)算法了
12             int mid = l+(r-l)/2;
13             if(nums[mid] == target)
14             {
15                 first = mid;//在查找过程中使用一个变量随时跟踪记录信息
16                 if(mid>l && nums[mid-1] == target)//如果还有左边,并且左边等于目标
17                     r=mid-1;
18                 else//其他情况或者没有左边或者左边的值不等于目标
19                     break;
20             }
21             else if(nums[mid]>target)
22                 r=mid-1;
23             else
24                 l=mid+1;
25 
26         }
27         
28         int second = -1;
29         l = 0;
30         r = n-1;
31         while(l<=r)
32         {
33             int mid = l+(r-l)/2;
34             if(nums[mid] == target)
35             {
36                 second = mid;
37                 if(mid<r && nums[mid+1] == target)//如果还有右边,并且右边等于目标
38                     l=mid+1;
39                 else//其他情况或者没有右边或者右边的值不等于目标
40                     break;
41             }
42             else if(nums[mid]>target)
43                 r=mid-1;
44             else
45                 l=mid+1;
46 
47         }
48 
49         ret.push_back(first);
50         ret.push_back(second);
51 
52         return ret;
53         
54     }
55 
56 };

 

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

原文:https://www.cnblogs.com/zjuhaohaoxuexi/p/11776852.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!