LeetCode 34. Search for a Range
来源:互联网 发布:聚合tv软件 编辑:程序博客网 时间:2024/06/09 23:15
Second solution is my favourite actually. But it seems that some interviewer prefer to do it recursively.
#include <iostream>#include <vector>using namespace std;/* Given a sorted arry of integers. Find the starting and ending position of a given target value. algorithm's run time should be in order of O(lgn) 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];*/// First solution. O(lgn) but worst time O(n).vector<int> searchRange(vector<int>& nums, int target) { int left = 0, right = nums.size() - 1; vector<int> res; while(left <= right) { int mid = (left + right) / 2; if(nums[mid] == target) { int left = mid; int right = mid; while(nums[left] == target) {left--;} while(nums[right] == target) {right++;} if((nums[left+1] == target) && (nums[right-1] == target)) { res.push_back(left+1); res.push_back(right-1); return res; } } else if(nums[mid] < target) left = mid + 1; else right = mid - 1; } return {-1, -1};}
int searchRangeRight(vector<int>& nums, int target) { int left = 0, right = nums.size() - 1; while(left < right) { int mid = (left + right + 1) / 2; // here should plus 1, make it moving. if(nums[mid] > target) right = mid - 1; else left = mid; } if(nums[left] == target) return left; return -1;}int searchRangeLeft(vector<int>& nums, int target) { int left = 0, right = nums.size() - 1; while(left < right) { int mid = (left + right) / 2; if(nums[mid] < target) left = mid + 1; else right = mid; } if(nums[right] == target) return right; return -1;}
// Second solution. always O(lgn) even with repeations.vector<int> searchRangeII(vector<int>& nums, int target) { int left = 0, right = nums.size() - 1; int leftIndex = searchRangeLeft(nums, target); int rightIndex = searchRangeRight(nums, target); return {leftIndex, rightIndex};}int searchRangeIII(vector<int>& nums, int left, int right, int target, bool flag) { if(left > right) return -1; int mid = (left + right) / 2; if(nums[mid] == target) { int pos = flag ? searchRangeIII(nums, left, mid - 1, target, flag) : searchRangeIII(nums, mid + 1, right, target, flag); return pos == -1 ? mid : pos; } else if(nums[mid] < target) searchRangeIII(nums, mid + 1, right, target, flag); else searchRangeIII(nums, left, mid - 1, target, flag);}
// Let's do it recursively....vector<int> searchRangeIII(vector<int>& nums, int target) { int left = 0, right = nums.size() - 1; bool leftFlag = true; int leftIndex = searchRangeIII(nums, left, right, target, leftFlag); int rightIndex = searchRangeIII(nums, left, right, target, !leftFlag); return {leftIndex, rightIndex};}int main(void) { vector<int> nums{5, 7, 7, 8, 8, 10}; vector<int> res = searchRangeIII(nums, 7); for(int i = 0; i < res.size(); ++i) { cout << res[i] << endl; }}
0 0
- [LeetCode]34.Search for a Range
- LeetCode --- 34. Search for a Range
- LeetCode 34.Search for a Range
- [Leetcode] 34. Search for a Range
- [leetcode] 34.Search for a Range
- 【leetcode】34. Search for a Range
- [leetcode] 34. Search for a Range
- Leetcode 34. Search for a Range
- LeetCode 34. Search for a Range
- <LeetCode OJ> 34. Search for a Range
- 34. Search for a Range LeetCode
- [Leetcode]34.Search for a Range
- leetcode 34. Search for a Range
- leetcode 34. Search for a Range
- leetcode 34. Search for a Range
- leetcode 34. Search for a Range
- LeetCode *** 34. Search for a Range
- LeetCode 34. Search for a Range
- install MySQLdb
- log4j debug写法
- UIBezierPath
- RMQ问题的ST算法
- 上传到jcenter的步骤
- LeetCode 34. Search for a Range
- mysql如何查看未使用的索引
- 机器学习与计算机视觉相关资源(不断更新中...)
- angular自定义指令
- WIN10 X64下通过TLS实现反调试
- oc开发笔记3 录音时频率获取 以及声像显示
- 不知道是win10在抽风还是校园网在抽风
- Bzoj3190:[JLOI2013]赛车:半平面交
- PHP中session变量的销毁