leetcode 34 search for a range
来源:互联网 发布:js将base64转换成文件 编辑:程序博客网 时间:2024/05/18 09:07
递归
class Solution {public: typedef vector<int>::size_type sz; vector<int> searchRange(vector<int>& nums, int target) { sz size = nums.size(); if (size == 0) return vector<int>(2, -1); vector<int> ret; // the ragne we are finding is [left, right] int left = 0; int right = size - 1; int mark = -1; while(left <= right) { int piv = (left + right) / 2; //向左偏 if (nums[piv] == target) { mark = piv; // left mark the index of the number which is equal to target break; } else if (nums[piv] < target){ left = piv + 1; } else { right = piv - 1; } } if (mark == -1) // no number in the nums is equal to target return vector<int>(2, -1); else { cout << mark << endl; ret.push_back(leftFind(nums, 0, mark, target)); ret.push_back(rightFind(nums, mark, size - 1, target)); } return ret; }private: // find the left boundary int leftFind(vector<int>& v, size_t b, size_t e, int target) { if (b == e) return e; size_t piv = (b + e) / 2; if (v[piv] == target) return leftFind(v, b, piv, target); else return leftFind(v, piv + 1, e, target); } // find the right boundary int rightFind(vector<int>& v, size_t b, size_t e, int target) { if (b == e) return b; size_t piv = (b + e + 1) / 2; if (v[piv] == target) return rightFind(v, piv, e, target); else return rightFind(v, b, piv - 1, target); }};
hehe
class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { vector<int> ret(2, -1); typedef vector<int>::iterator It; pair<It, It> p = equal_range(nums.begin(), nums.end(), target); if (p.first != p.second) { ret[0] = p.first - nums.begin(); ret[1] = p.second - nums.begin() - 1; } return ret; }};
参考后
class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { int size = nums.size(); vector<int> ret(2, -1); if (size == 0) return ret; int left = -1; int right = -1; // find left boundary int l = 0; int r = size - 1; while (l < r) { int mid = (l + r) / 2; // 向左偏 if (nums[mid] < target) l = mid + 1; else r = mid; } if (nums[l] == target) left = l; else return ret; // 没有数字和 target 相同 // find right boundary l = left; r = size - 1; while (l < r) { int mid = (l + r + 1) / 2; // 向右偏 不然 r = mid -1 会小于0 if (nums[mid] > target) r = mid - 1; else l = mid; // 不能是 mid -1 因为nums[l] 可能是target } right = r; ret[0] = left; ret[1] = right; return ret; }};
阅读全文
0 0
- LeetCode(34)Search for a Range
- [LeetCode] Search for a Range [34]
- LeetCode 34 Search for a Range
- [leetcode 34] Search for a Range
- Leetcode NO.34 Search for a Range
- [LeetCode 34]Search for a Range
- leetcode-34 Search for a Range
- Leetcode 34 Search for a Range
- Search for a Range - LeetCode 34
- 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, Medium] Search for a Range
- [leetcode-34]Search for a Range(C)
- Leetcode#34||Search for a Range
- LeetCode(34)Search for a Range
- asList的使用缺陷—不能将8种基本数据类型数组转换为列表
- 【玩转云存储】对象存储OSS使用方法入门
- swift 带参,无参,函数加返回值。闭包
- win10 64SQLServer2008安装时报is not a valid login or you do not have permission的解决方法
- 深入理解Java:注解(Annotation)自定义注解入门
- leetcode 34 search for a range
- elasticsearch5.2.2 ik logstash5.2.2 搭建
- POJ
- MyBatis Generator操作说明
- BIRT集成WEB项目。
- 用JS获取地址栏的参数的方法
- PHP方法参数类型声明
- 递归遍历文件夹下所有文件
- 机器学习第3章第1节 : Anaconda3的安装和汉化