局部最小
这个题要是遍历的话就没意思了,主要是颠覆下二分的思想,不一定是有序才可以二分,在满足一定数据情况下,不有序也可以用二分。
如果可以确定某一部分的数据没有所要的结果,或者不需要(就像本题,找到mid,如果左右比mid小,那么左右都会有局部最小,选一个就行了),可以把这一部分舍弃掉,加快程序效率。
int judge(int a,int b,int c=INT_MIN) { if (b < c&&b < a) { return 1; } return 0; } int partSmall(int *a,int length) { if (judge(a[1], a[0])) return a[0]; if (judge(a[length - 2], a[length - 1])) return a[length - 1]; int beg = 1, end = length - 2; while (beg <= end) { //这里边界不用扣得太死,一定不会漏掉的 int mid = (beg + end) / 2; if (judge(a[mid - 1], a[mid], a[mid + 1])) return a[mid]; if (a[mid - 1] < a[mid]) end = mid - 1; else if (a[mid + 1] < a[mid]) beg = mid + 1; } }