求旋转数组的最小值

已知一个递增排序的数组(可能有重复数字)在某处经过旋转,如{1,2,3,4,5}的一个旋转数组为{3,4,5,1,2},求旋转数组的最小值

解题思路:(1)第一个指针总是指向前面的递增数组,最终停在最大的元素上,即元素5,若与下一个元素相等则指向下一个元素;
(2)第二个指针总是指向后面的递增数组,最终停在最小的元素上,即元素1,若与下一个元素相等则指向下一个元素

int findMin(int* nums, int numsSize) {

if (nums == NULL || numsSize == 0)
    return NULL;
else if (numsSize == 1)
    return nums[0];

int start = 0;
int end = numsSize-1;
int middle = (start+end)/2;

//若数组未经过旋转
if (nums[start] < nums[end])
    return nums[start];

while (start < end)
{
    if (end-start == 1)
    {
        return nums[end];
    }

    //遇到重复数字时的处理方法
    if (nums[start] == nums[start+1])
        start++;
    if (nums[end] == nums[end-1])
        end--;

    middle = (start+end)/2;
    if (nums[middle] > nums[start])
    {
        start = middle;
    }
    else if (nums[middle] < nums[end])
    {
        end = middle;
    }
}

return nums[middle];

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值