典型的应用有:
1、最常规问题:在有序数组中查找某个值。
2、有序数组中查找某个值的所在范围。http://blog.youkuaiyun.com/ojshilu/article/details/17125531
3、在循环有序数组中查找某个值。http://blog.youkuaiyun.com/ojshilu/article/details/17485787
4、在循环有序数组中查找数组最小值(即循环偏移位置)。http://blog.youkuaiyun.com/ojshilu/article/details/40296471
二分查找的主要步骤:
一般都是根据左右边界left和right来控制查找范围,取得中间位置A[mid],依据mid位置的值来选择下一步向什么范围查找。这其中包含了两个细节:
1、A[mid]和谁比较;
2、比较之后如何缩小问题范围;
对于上面说的四种应用,所采用的这两个细节是不同的。
class Solution {
public:
int findMin(vector<int> &num) {
int left, right, mid;
left = 0, right=num.size()-1;
mid = (left + right)/2;
while(left < right)
{
mid = (left + right)/2;
if(num[mid] > num[left]) //转折点到右侧
left = mid;
else if (num[mid] < num[left]) //转折点在左侧
right = mid;
else // left+1 == right
{
mid++; // 4 5 6 1 2 实例比较
break;
}
}
int min = num[mid];
min = (min<num[0])?min:num[0]; //如果并未循环移动过
return min;
}
};