二分查找循环最小值

典型的应用有:
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;  
    }  
};  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值