34. 在排序数组中查找元素的第一个和最后一个位置
Posted 2016bits
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了34. 在排序数组中查找元素的第一个和最后一个位置相关的知识,希望对你有一定的参考价值。
一、题目描述
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:
你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
二、示例
示例 1:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
示例 2:
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
示例 3:
输入:nums = [], target = 0
输出:[-1,-1]
补充示例 4:
输入:nums = [8,8,8,8], target = 0
输出:[0,3]
补充示例 5:
输入:nums = [1,2,2], target = 2
输出:[1,2]
补充示例 6:
输入:nums = [1,4], target = 4
输出:[0,1]
三、输入输出说明
0 <= nums.length <= 10^5
-10^9 <= nums[i] <= 10^9
nums 是一个非递减数组
-10^9 <= target <= 10^9
四、基本思路
二分法的变形:
1、先用二分法查找target
2、然后在其前半部分查找target的前一个数
3、再在其后半部分查找target的后一个数。
注意编码细节:查找后半部分是从第一个target的下一个位置查找至数组最后一个位置
注意特殊情况:前半部分均为target,即2过程查找失败,此时left=-1,right=0,mid=0,此时target起始位置即为mid;后半部分均为target,即3查找失败,同理,此时target起始位置也为mid
五、代码
class Solution
public:
vector<int> searchRange(vector<int>& nums, int target)
int len = nums.size();
if (len == 0)
return -1, -1;
int left = 0, right = len - 1, mid;
while (left <= right) //二分
mid = (left + right) / 2;
if (nums[mid] == target)
break;
else if (nums[mid] > target)
right = mid - 1;
else
left = mid + 1;
if (left > right) //查找失败
return -1, -1;
int head = mid, tail = mid;
left = 0, right = mid - 1;//在前半部分查找target的前一个数
while (left <= right)
mid = (left + right) / 2;
if (nums[mid] != target && nums[mid+1] == target)
head = mid + 1;
break;
if (nums[mid] < target) //在右半部分继续找
left = mid + 1;
else
right = mid - 1;
if (left > right) //前半部分全为target
head = mid;
left = mid + 1, right = len - 1;//在后半部分查找target的后一个数
while (left <= right)
mid = (left + right) / 2;
if (nums[mid] != target && nums[mid-1] == target)
tail = mid - 1;
break;
if (nums[mid] > target) //在左半部分继续找
right = mid - 1;
else
left = mid + 1;
if (left > right) //后半部分全为target
tail = mid;
return head, tail;
;
以上是关于34. 在排序数组中查找元素的第一个和最后一个位置的主要内容,如果未能解决你的问题,请参考以下文章
java刷题--34在排序数组中查找元素的第一个和最后一个位置
LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置 | Python
算法leetcode|34. 在排序数组中查找元素的第一个和最后一个位置(rust重拳出击)