81. 搜索旋转排序数组 II AND 153. 寻找旋转排序数组中的最小值

本文介绍了如何使用二分查找算法解决搜索旋转排序数组的问题,包括在`search旋转排序数组II`中快速定位目标值和在`findMin`中寻找最小值的具体实现。讨论了面对重复元素和有序区间时的优化策略。

81. 搜索旋转排序数组 II

 思路:因为题目要求了必须尽可能减少整个操作步骤,所以用for循环线性找就不行了,故用二分法。对于当前的中点, 如果它指向的值小于等于右端,那么说明右区间是排好序的;反之,那么说明左区间是排好序的。 如果目标值位于排好序的区间内,我们可以对这个区间继续二分查找;反之,我们对于另一半区间继续二分查找。但数组中可能存在重复数字,所以,如果中点和左端的数字相同,我们并不能确定是左区间全部相同,还是右区间完全相同。在这种情况下,可以将左端点右移一位,然后继续进行二分查找。

bool search(int* nums, int numsSize, int target){
    int left,right,mid;
    left = 0; right = numsSize - 1;
    while(left <= right){
        mid = left + (right - left) / 2;
        if(nums[mid] == target)
            return true;
        if(nums[left] == nums[mid])
            left++;
        else
            if(nums[mid] <= nums[right]){//右区间有序
                if(target > nums[mid] && target <= nums[right])
                    left = mid + 1;
                else    
                    right = mid - 1;
            }
            else{//左区间有序
                if(target >= nums[left] && target < nums[mid])
                    right = mid - 1;
                else    
                    left = mid + 1;
            }
    }
    return false;
}

153. 寻找旋转排序数组中的最小值

 

int findMin(int* nums, int numsSize){
    int left,right,mid;
    left = 0; right = numsSize - 1;
    while(left < right){
        mid = left + (right - left) / 2;
        if(nums[mid] < nums[right])
            right = mid;//不是mid - 1的原因是:可能nums[mid]即为最小值而被错过
        else//而当 nums[mid] >= nums[right]时,nums[mid]必不为最小值
            left = mid + 1;
    }
    return nums[left];
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值