-
Notifications
You must be signed in to change notification settings - Fork 0
[LeetCode] 34. 在排序数组中查找元素的第一个和最后一个位置 #101
Copy link
Copy link
Open
Description
题目描述:
给定一个按照升序排列的整数数组 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]
解题思路:使用二分法,每次从中间开始比较mid值和target值,mid值更大,说明在左边更小的区间(更新end),否则在右边的区间(更新begin)。最后找到mid值之后,从mid中间往左右两边扩散找相同的值
C++解题:
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> res = {-1,-1};
int begin = 0,end = nums.size()-1;
if(nums.size() == 1){
if(nums[0] != target) return res;
else return {0,0};
}
while (begin <= end)
{
int mid = (end - begin)/2+begin;
if(nums[mid] > target){
end = mid-1;
}else if(nums[mid] < target){
begin = mid+1;
}else{
begin = mid;end = mid;
while(begin >= 0 && nums[begin] == target){
begin--;
if(begin < 0){
begin = 0;
break;
}
}
while(end < nums.size() && nums[end] == target){
end++;
if(end >= nums.size()){
end = nums.size() -1;
break;
}
}
if(begin >= 0 && nums[begin] != target) begin++;
if(end < nums.size() && nums[end] != target) end--;
res[0] = begin;
res[1] = end;
break;
}
}
return res;
}
};
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels