注意要是查找一个数组的话 应该从(-1, n)的范围内查找
r表示出现的最小位置
void solve(int l, int r)///(l,r]{while(l + 1 < r){int mid = (l + r) >> 1;if(a[mid] >= k) r = mid;else l = mid;}cout<<l<<" "<<r<<endl;}
void solve(int l, int r)///[l,r){while(l + 1< r){int mid = (l + r) >> 1;if(a[mid] > k) r = mid;else l = mid;}cout<<l<<" "<<r<<endl;}
///将一个递减数列移位 如 6 5 4 3 2 1 -> 4 3 2 1 6 5///现在要在移位之后的序列中查找值///思路: 二分之后 一定有一段是递减 判断查找值是否在该段内 如果在很容易查找 否则继续查找int solve(int *a, int value, int l, int r){while(l <= r){int mid = (l + r) >> 1;if(a[mid] == value)return mid;else{if(a[l] >= a[mid]){if(value<=a[l] && value>=a[mid])r = mid - 1;elsel = mid + 1;}else{if(value<=a[mid] && value>=a[r])l = mid + 1;elser = mid - 1;}}}}
原文:http://blog.csdn.net/dojintian/article/details/46604385