范围查找
来源:互联网 发布:福禄克网络测试 编辑:程序博客网 时间:2024/06/05 08:59
Search for a Range
- 题目来源:
leetcode 34
线性算法
利用第二种思路编写代码如下:
vector<int> searchRange(vector<int>& nums, int target) { vector<int> ans; if (nums.size()==0) { //如果为空返回[-1,-1] ans.push_back(-1); ans.push_back(-1); return ans; } else{ int start = 0; int end = nums.size()-1; int mid; int pos=-1; while (start<=end) { mid = (start+end)/2; if (nums[mid]==target) { pos = mid; //找到位置时则纪录位置为pos,并终止循环 break; } else if(nums[mid]>target){ end = mid-1; } else{ start = mid+1; } } if (pos!=-1) { //当找到了target位置时,分别向两边扩展查找 int i=pos; while (nums[i]==target&&i>=0) { //向左边界扩展;当找到nums[i]!=target或者到达左边界了,则停止 i--; } int j=pos; while (nums[j]==target&&j<nums.size()) { //向右边界扩展;当找到nums[i]!=target或者到达右边界了,则停止 j++; } ans.push_back(i+1); ans.push_back(j-1); return ans; } else{ ans.push_back(-1); ans.push_back(-1); return ans; } }}
log(n)的算法
int findStart(vector<int>& nums, int target){ //寻找左边界 if (nums.size()==0) { return -1; } else{ int start = 0; int end = nums.size()-1; int mid; while (start<=end) { mid = (start+end)/2; if(nums[mid]==target){ if (mid==0) { //当mid为数组最左边时,则mid就是左边界 return mid; } else if(nums[mid-1]!=target) //当nums[mid-1]!=target,则说明mid是左边界(mid-1不越界的情况下) return mid; else end=mid-1; } else if(nums[mid]<target){ start=mid+1; } else end=mid-1; } return -1; }}int findEnd(vector<int>& nums, int target){ //寻找右边界 if (nums.size()==0) { return -1; } else{ int start = 0; int end = nums.size()-1; int mid; while (start<=end) { mid = (start+end)/2; if(nums[mid]==target){ if (mid==nums.size()-1) { //当mid为数组最右边时,则mid就是右边界 return mid; } else if(nums[mid+1]!=target) //当nums[mid+1]!=target,则说明mid是右边界(mid+1不越界的情况下) return mid; else start=mid+1; } else if(nums[mid]<target){ start=mid+1; } else end=mid-1; } return -1; }}vector<int> searchRange(vector<int>& nums, int target) { vector<int> ans; if (nums.size()==0) { ans.push_back(-1); ans.push_back(-1); return ans; } else{ //分别寻找左右边界 int start = findStart(nums, target); int end = findEnd(nums, target); ans.push_back(start); ans.push_back(end); return ans; }}
0 0
- 范围查找
- Spatialite 按范围查找
- lucene3.0范围查找TermRangeQuery
- lucene3.0范围查找TermRangeQuery
- 范围概率 用二分查找
- 利用STL二分查找范围
- leetcode--34--二分查找范围
- 给定范围的二分法查找
- 二分查找(范围统计)
- 如何将折半查找应用于范围查找?
- 使用 std::map 查找 IP 范围
- 二叉查找树范围查询算法
- visual stutio 中的include引用查找范围
- 算法5-4:1d范围查找
- Tair LDB基于Prefixkey的范围查找
- 范围查找 和最近的一些感想
- 如何实现按距离排序、范围查找
- 如何实现按距离排序、范围查找
- 进程 线性地址到物理地址的映射
- 每天一个linux命令:find 命令概览
- PAT A1004 Counting Leaves(30)
- 使用SIMD技术提高C++程序性能
- 学习TDD(3)--实例2:基于ZooKeeper的服务器注册和探测类[分析篇]
- 范围查找
- 四种第三方登录
- 每天一个linux命令:find命令之exec
- 1st group anagram 49
- PART VIII 总结 Chapter 17 计算的限制
- 动规-区间DP模板
- PAT A1003 Emergency(25)
- 阿里面试回来,想和Java程序员谈一谈
- 异常解决—org.hibernate.QueryException: could not resolve property: “xxx”