LeetCode || Search for a Range
来源:互联网 发布:mac终端连接阿里云 编辑:程序博客网 时间:2024/06/10 03:08
使用二分查找算法,但是遇到求解范围的时候遇到瓶颈。先用顺序搜索求解。
时间:20ms。
class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { int i = 0, j = nums.size()-1; int mid = (i+j)/2; vector<int> range; range.push_back(-1); range.push_back(-1); while(i <= j) { if(nums[mid] == target)// { range[0] = i; range[1] = j; break; } else if(nums[mid] > target) { j = mid-1; mid = (i + j)/2; } else { i = mid+1; mid = (i+j)/2; } } while(range[0] < nums.size() && nums[range[0]] != target) range[0]++; while(range[1] < nums.size() && nums[range[1]] != target) range[1]--; return range; }};
从后往前搜索,时间提高,变为12ms、
class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { int i = 0, j = nums.size()-1; int mid = (i+j)/2; vector<int> range; range.push_back(-1); range.push_back(-1); while(i <= j) { if(nums[mid] == target)// { //从i到mid搜索第一个target int tmp = mid -1; while(tmp >= 0 && nums[tmp] == target) tmp--; range[0] = tmp+1; //从mid到j搜索最后一个target tmp = mid + 1; while(tmp < nums.size() && nums[tmp] == target) tmp++; range[1] = tmp-1;; break; } else if(nums[mid] > target) { j = mid-1; mid = (i + j)/2; } else { i = mid+1; mid = (i+j)/2; } } return range; }};
递归方法实现二分搜索;耗时12ms。
class Solution {public: vector<int> searchRangeCore(vector<int>& nums, int s, int e, int target) { int mid = (s+e)/2; vector<int> range; range.push_back(-1); range.push_back(-1); if(nums[s] == target && nums[e] == target) { range[0] = s; range[1] = e; return range; } while(s <= e) { if(nums[mid] == target)// { //从s到mid搜索第一个target vector<int> r1 = searchRangeCore(nums, s, mid, target); //从mid到e搜索最后一个target vector<int> r2 = searchRangeCore(nums, mid+1, e, target); //联合r1和r2 if(r1 == range) range = r2; if(r2 == range) range = r1; if(r1[1] == r2[0]-1) { range[0] = r1[0]; range[1] = r2[1]; } break; } else if(nums[mid] > target) { e = mid-1; mid = (s + e)/2; } else { s = mid+1; mid = (s+e)/2; } } return range; } vector<int> searchRange(vector<int>& nums, int target) { return searchRangeCore(nums, 0, nums.size()-1, target); }};
0 0
- LeetCode: 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] 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 - Search for a Range
- Search for a Range leetcode
- LeetCode | 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: Search for a Range
- vs中无法加入断点进行调试的解决方案
- 黑马程序员java基础学习日记——做题遇到GBK查资料发现了个有趣的文章——ASCII、Unicode、GBK和UTF-8字符编码的区别联系
- Nullability Annotations
- 0-1分数规划的Dinkelbach算法
- App store 2015最新审核标准公布
- LeetCode || Search for a Range
- C#_C#中的事件
- 图
- C++ 墙角知识
- redis编程(hredis)
- HDU 2546 饭卡 (基础01背包)
- java入门学习总结——【java菜鸟成长记】
- weak的生命周期
- HTML设置超链接字体颜色和点击后的字体颜色