二分查找的改进
在转动过的有序数组中寻找目标值
http://www.nowcoder.com/questionTerminal/7cd13986c79d4d3a8d928d490db5d707
- 本题的调试有点问题。。
一、暴力『不是最优』
class Solution { public: /** * * @param A int整型一维数组 * @param n int A数组长度 * @param target int整型 * @return int整型 */ int search(int* A, int n, int target) { // write code here int loop=n; while( loop-- ) { if( A[loop]==target ) { return loop; } } return -1; } };
二、改进的『二分查找』
//不要被“旋转”而迷惑,“有序”并不是二分查找的核心 // 二分查找的核心是"通过界桩快速决定查找方向,大幅缩短查找空间" // 只要能快速确定界桩,就能使用二分查找 // 充分利用有序数组能够快速获取边界值的特性 // 利用这一特性可以快速确定目标值应处的区间
class Solution { public: /** * * @param A int整型一维数组 * @param n int A数组长度 * @param target int整型 * @return int整型 */ int search(int* A, int n, int target) { // write code here int Left=0,Right=n-1,mid; while( Left<=Right ) { mid= Left + (Right-Left)/2; if( A[mid]==target ) { return mid; } //左边的有序区间 if( A[mid]>=A[Left] ) { if( A[Left]<=target && target<A[mid]) { Right=mid-1; } else { Left=mid+1; } } else { if( A[mid]<target && target<=A[Right] ) { Left=mid+1; } else { Right=mid-1; } } } //没有找到的话 return -1; } };