旋转数组

本文深入探讨了使用二分查找算法解决序列中最小值问题的高效方法,通过实例演示了如何在有限时间内准确找到序列的最小元素,特别关注了算法的实现细节及边界条件处理。
#include <cstdio>
//1.该题目来自 http://ac.jobdu.com/problem.php?pid=1386
//2.目前任然有数据未通过, 注意333123 为合法输入
//3.朴素可直接AC,但这里重点考察二分 

#define MAXSIZE 1000010
#define MAXVAL  10000010

int elementTots;
int elements[MAXSIZE];

int main()
{
    int ans;
    while( EOF != scanf("%d", &elementTots)){
        for(int currPos = 1; currPos <= elementTots; currPos++){
            scanf("%d", &elements[currPos]);
        }
        int lftPos = 1;
        int rhtPos = elementTots;
        if(elements[lftPos] < elements[rhtPos]|| 1 == elementTots){
                ans = elements[lftPos];
        }else{
            while(lftPos < rhtPos){
                if(1 == rhtPos - lftPos){
                    ans = elements[rhtPos];
                    break;
                }
                int midPos = lftPos + ( (rhtPos - lftPos) >> 1);
                    if(elements[midPos] >= elements[lftPos]){
                            lftPos = midPos;
                            continue;
                    }
                    if(elements[midPos] < elements[rhtPos]){
                            rhtPos = midPos;
                            continue;
                    }
                    if(elements[midPos] == elements[rhtPos]){
                            rhtPos = midPos - 1;
                    }
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}


转载于:https://my.oschina.net/u/572632/blog/286045

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值