题目: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”
感觉代码还有再精简的空间