题目:https://leetcode.com/problems/search-for-a-range/
思路:看LogN级别时间复杂度的要求就应该可以想到要用二分查找类似的做,关键问题是有重复元素,就是说如果找到了a[i]==target,还得顾及一下他的左右邻居的值是不是也一样的,如果是的话,那说明还得继续找
代码:
class Solution {
public:
int searchMin(vector<int>& nums, int target) {
int l = 0;
int r = nums.size() - 1;
int m;
while (l <= r) {
m = (l + r)/2;
if(nums[m] == target){
if(m == 0)
return m;
else if(nums[m-1] < target) //targst cannot be in the left part
return m;
else {
r = m - 1;
}
} else if(nums[m] < target) {
l = m + 1;
} else {
r = m - 1;
}
}
return -1;
}
int searchMax(vector<int>& nums, int target) {
int l=0;
int r = nums.size() - 1;
int m;
while(l <= r) {
m = (l + r)/2;
if(nums[m] == target){
if (m == r)
return m;
else if(nums[m+1] > target)
return m;
else
l = m + 1;
} else if (nums[m] < target) {
l = m + 1;
} else {
r = m - 1;
}
}
return -1;
}
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> result;
result.push_back(searchMin(nums, target));
result.push_back(searchMax(nums, target));
return result;
}
};
One reply on “LeetCode 34. Search for a Range”
感觉代码还有再精简的空间