随手练——局部最小(二分思想)

局部最小


 

这个题要是遍历的话就没意思了,主要是颠覆下二分的思想,不一定是有序才可以二分,在满足一定数据情况下,不有序也可以用二分。

如果可以确定某一部分的数据没有所要的结果,或者不需要(就像本题,找到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;
    }
    
}

猜你喜欢

转载自www.cnblogs.com/czc1999/p/10350945.html