首页 > 其他 > 详细

Search for a Range

时间:2014-10-05 15:49:08      阅读:198      评论:0      收藏:0      [点我收藏+]

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].

 

主要考察二分搜索,模仿stl中lower_bound和upper_bound,算法大致流程是先二分查找target,找不到直接返回[-1,-1],找到则在左半部分二分查找第一个等于target的数,在右半部分二分查找第一个大于target的数

 1 class Solution {
 2 public:
 3     vector<int> searchRange(int A[], int n, int target) {
 4         vector<int> ans(2, -1);
 5         if( !A || n<1 ) return ans;
 6         int left = 0, right = n-1;
 7         while( left <= right ) {
 8             int mid = left + (right-left) / 2;
 9             if( target == A[mid] ) {
10                 ans[0] = lower_bound(A, left, mid-1, target);
11                 ans[1] = upper_bound(A, mid+1, right, target)-1;
12                 return ans;
13             }
14             if( target > A[mid] ) left = mid+1;
15             else right = mid-1;
16         }
17         return ans;
18     }
19     
20     int lower_bound(int A[], int left, int right, int target) { //找到第一个等于target的数
21         while( left <= right ) {
22             int mid = left + (right-left) / 2;
23             if( target > A[mid] ) left = mid+1;
24             else right = mid-1;
25         }
26         return right + 1;
27     }
28     
29     int upper_bound(int A[], int left, int right, int target) { //找到第一个大于target的数
30         while( left <= right ) {
31             int mid = left + (right-left) / 2;
32             if( target >= A[mid] ) left = mid+1;
33             else right = mid-1;
34         }
35         return left;
36     }
37 };

 

Search for a Range

原文:http://www.cnblogs.com/bugfly/p/4007035.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!