1、首先面临使用recursion(递归)or while-loop(while循环)
此处用while-loop,工程一般要求别用递归。
keypoints: 1、start + 1< end 2、start + (end - start)/2
3、A[mid] ==,<,> 4、A[start] A[end] ? target
解释:1.start + 1< end 不符合的话只有两种情况,start与end相邻或者相交重合,此处为了以后作为模板通用所以使用此写法,它能够有效防止死循环。
2.防止数太大溢出,显得你很细心
3.因为在1中使用了start + 1< end 有效防止死循环,可以判断后直接end = mid / start = mid而不用end =mid+1 / start+1;
Class solution{
int binarySearch(int[] A , int target){
if(A.size()==0){
return -1;
}
int start = 0;
int end = A.size()-1;
int mid;
while(start + 1 < end){
mid = start + (end - start)/2;
if(A[mid] == target){
end = mid;
}else if(A[mid] < target){
start = mid;
}else if(A[mid] > target){
end = mid;
}
}
if(A[start] == target){
return start;
}
if(A[end] == target){
return end;
}
return -1;
}
}
2、用binary-search的一般条件
http://www.lintcode.com/zh-cn/problem/search-insert-position/
http://www.lintcode.com/zh-cn/problem/search-a-2d-matrix/
http://www.lintcode.com/zh-cn/problem/first-bad-version/
http://www.lintcode.com/zh-cn/problem/find-peak-element/
http://www.lintcode.com/zh-cn/problem/find-minimum-in-rotated-sorted-array/
http://www.lintcode.com/zh-cn/problem/search-in-rotated-sorted-array/
http://www.lintcode.com/zh-cn/problem/merge-sorted-array/
http://www.lintcode.com/zh-cn/problem/median-of-two-sorted-arrays/
三步翻转法
http://www.lintcode.com/zh-cn/problem/recover-rotated-sorted-array/
http://www.lintcode.com/zh-cn/problem/rotate-string/
http://www.lintcode.com/zh-cn/problem/reverse-words-in-a-string/