Search for a Range--LeetCode
2015-03-30 10:45
239 查看
题目:
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].
思路:两次使用二分查找,分别找上限和下限
#include <iostream> #include <vector> #include <string> using namespace std; /* 在一个排好序的序列中找打某个值的第一个位置 和最后一个位置 */ pair<int,int> Findvalue(vector<int>& vec,int key) { pair<int,int> pos(-1,-1); int mid,begin = 0,end = vec.size(); mid = begin + (end-begin)/2; if(vec[mid] == key) { pos.first = mid; pos.second= mid; } int low = mid; int high = mid+1; // 找低地址 while(begin<= low) { mid = begin+((low-begin)/2); if(vec[mid] == key) { if(pos.first == -1 || (pos.first!=-1 && mid < pos.first)) pos.first = mid; low = mid-1; } else if(vec[mid] > key) low = mid-1; else begin = mid+1; } //找高地址 while(high <= end) { mid = high+( (end-high)/2); if(vec[mid] == key) { if(pos.first == -1 || (pos.first!=-1 && mid >pos.first)) pos.second =mid; high = mid+1; } else if(vec[mid] > key) end = mid-1; else high = mid+1; } return pos; } int main() { int array[]={5, 7, 7, 8, 8, 10}; vector<int> vec(array,array+sizeof(array)/sizeof(int)); pair<int,int> pos = Findvalue(vec,8); cout<<pos.first<<" "<<pos.second<<endl; return 0; }
上述的方法有缺陷。首先是需要找到,然后再确定位置,其实使用lower_bound和upper_bound是组合适的
pair<int,int> Findvalue(vector<int>& vec,int key) { pair<int,int> pos(-1,-1); int mid,begin = 0,end = vec.size(); while( begin<= end) { mid = begin +( (end-begin)/2); if(vec[mid] == key) { pos.first = mid; pos.second= mid; break; } else if(vec[mid] > key) end = mid-1; else begin = mid+1; } if(vec[mid]!= key) return pos; int low = mid-1; int high = mid+1; // 找低地址 while(begin<= low) { mid = begin+((low-begin)/2); /*if(vec[mid] == key) { if( mid < pos.first)) pos.first = mid; low = mid-1; } else*/ if(vec[mid] < key) begin= mid+1; else low = mid-1; } pos.first = begin; //找高地址 while(high <= end) { mid = high+ (end-high)/2; /* if(vec[mid] == key) { if( mid >pos.second)) pos.second =mid; high = mid+1; } else*/ if(vec[mid] > key) end = mid-1; else high = mid+1;} pos.second = high-1; return pos; }
如果使用STL中的算法,可以使用lower_bound和upper_bound函数,
第一个函数的作用是,如果在一个区间查找一个值,如果这个值存在的话,那么返回第一个这个值存在的位置,如果不存在,那么返回第一个合适插入当前值的位置,也就是返回第一个不小于value的位置.
upper_bound函数的作用是返回最后一个不小于value的位置。它返回在不破坏顺序的情况下,可插入value的最后一个合适的位置。
相关文章推荐
- leetcode Search for a Range
- LeetCode--Search for a Range
- Search for a Range <leetcode>
- 算法分析与设计课程(5):【leetcode】Search for a Range
- LeetCode - Refresh - Search for a Range
- LeetCode --- 34. Search for a Range
- leetcode题解-34. Search for a Range
- Leetcode-Search for a Range(折半查找)
- [LeetCode] Search for a Range
- LeetCode 38: Search for a Range
- [LeetCode]problem 34. Search for a Range
- leetcode 34. Search for a Range
- 【LeetCode】C# 34、Search for a Range
- Leetcode||34. Search for a Range
- [Leetcode]_34 Search for a Range
- LeetCode:Search for a Range
- Leetcode——34. Search for a Range
- LeetCode(34)Search for a Range
- LeetCode解题报告--Search for a Range
- [Leetcode] Search for a Range