LeetCode: Search for a Range 解题报告
2017-02-06 21:04
337 查看
Search for a Range
Given a sorted array of integers, find the starting and ending position of a given target value.
Your algorithm's runtime complexity must be in the order of O(log n).
If the target is not found in the array, return [-1, -1].
For example,
Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].
SOLUTION 1:
使用改进的二分查找法。终止条件是:left < right - 1 这样结束的时候,会有2个值供我们判断。这样做的最大的好处是,不用处理各种越界问题。
请同学们一定要记住这个二分法模板,相当好用哦。
1. 先找左边界。当mid == target,将right移动到mid,继续查找左边界。
最后如果没有找到target,退出
2. 再找右边界。 当mid == target,将left移动到mid,继续查找左边界。
最后如果没有找到target,退出
注意以下疏漏:
1.函数输入nums可能为空,所以要单独考虑 if(nums.empty())
2.二分法要灵活运用,不要只局限于找一个中间值,一定要灵活运用,各种形式的二分法
Given a sorted array of integers, find the starting and ending position of a given target value.
Your algorithm's runtime complexity must be in the order of O(log n).
If the target is not found in the array, return [-1, -1].
For example,
Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].
SOLUTION 1:
使用改进的二分查找法。终止条件是:left < right - 1 这样结束的时候,会有2个值供我们判断。这样做的最大的好处是,不用处理各种越界问题。
请同学们一定要记住这个二分法模板,相当好用哦。
1. 先找左边界。当mid == target,将right移动到mid,继续查找左边界。
最后如果没有找到target,退出
2. 再找右边界。 当mid == target,将left移动到mid,继续查找左边界。
最后如果没有找到target,退出
class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { if(nums.empty()) { vector<int> resvec; resvec.push_back(-1); resvec.push_back(-1); return resvec; } int left=0,right=nums.size()-1; while(left<right-1) { int mid = (right +left) / 2; if(nums[mid]<target) left=mid; else right=mid; } int res_left; if(nums[left]==target) res_left=left; else if(nums[right]==target) res_left=right; else res_left=-1; left=0,right=nums.size()-1; while(left<right-1) { int mid = (right +left) / 2; if(nums[mid]>target) right=mid; else left=mid; } int res_right; if(nums[right]==target) res_right=right; else if(nums[left]==target) res_right=left; else res_right=-1; vector<int> resvec; resvec.push_back(res_left); resvec.push_back(res_right); return resvec; } };
注意以下疏漏:
1.函数输入nums可能为空,所以要单独考虑 if(nums.empty())
2.二分法要灵活运用,不要只局限于找一个中间值,一定要灵活运用,各种形式的二分法
相关文章推荐
- [Leetcode] 34. Search for a Range 解题报告
- [leetcode] 34. Search for a Range 解题报告
- [LeetCode] Search for a Range 解题报告
- LeetCode解题报告--Search for a Range
- [LeetCode] Search for a Range 解题报告
- LeetCode: Search for a Range 解题报告
- leetCode 34.Search for a Range (搜索范围) 解题思路和方法
- [leetcode javascript解题]Search for a range
- leetCode 34.Search for a Range (搜索范围) 解题思路和方法
- leetcode解题方案--034--Search for a Range
- [LeeCode]Search for a Range, 解题报告
- LeetCode Search for a Range
- leetcode -- Search for a Range (TODO)
- LeetCode_Search for a Range
- [leetcode] Search for a Range
- [Leetcode 89] 34 Search for a Range
- LeetCode: Search for a Range
- leetcode 96: Search for a Range
- Leetcode: Search for a Range
- LeetCode 38: Search for a Range