LeetCode 34
解题思路
1.题目中是有序数组,如果使用暴力遍历法,则直接可以得到答案,但是时间复杂度为O(n),显然会超时
2.所以采用变种的二分查找法:(1).首先对整个数组进行正常的二分查找,目标值为target (2).一旦查找到target不是停止,而是继续查找,直到low指针和high指针相等时结束 (3).对整个数组要进行两次二分查找,第一次查找时,当mid指针指向target时,最左面的元素一定在当前元素的左面,所以没必要对其右边进行遍历 (4).同理找最右元素也是一样,只不过注意的是,很有可能当low和high指针相等时,此时并没有指向target,而是其下一个元素,这个要单独讨论
运行结果
代码
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int lo = 0,hi = nums.size()-1,mid = (lo+hi)/2;
bool left = false;
int final_left = -1,final_right = -1;
vector<int> final_array;
while(lo <= hi){
mid = (lo+hi)/2;
if(lo == hi){
if(nums[lo] == target){
final_left = lo;
}
break;
}
if(nums[mid] >= target){
hi = mid;
}else{
lo = mid + 1;
}
}
lo = 0;
hi = nums.size()-1;
while(lo <= hi){
mid = (lo+hi)/2;
if(lo == hi){
if(nums[lo] == target){
final_right = lo;
}else if(lo > 0 && nums[lo - 1] == target){
final_right = lo - 1;
}
break;
}
if(nums[mid] > target){
hi = mid;
}else{
lo = mid + 1;
}
}
if(nums.size() == 1 && nums[0] == target){
final_left = 0;
final_right = 0;
}
final_array.push_back(final_left);
final_array.push_back(final_right);
return final_array;
}
};