zoukankan      html  css  js  c++  java
  • 九度OJ 1386 旋转数组的最小数字 【算法】

    题目地址:http://ac.jobdu.com/problem.php?pid=1386

    题目描述:

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。

    输入:

    输入可能包含多个测试样例,对于每个测试案例,

    输入的第一行为一个整数n(1<= n<=1000000):代表旋转数组的元素个数。

    输入的第二行包括n个整数,其中每个整数a的范围是(1<=a<=10000000)。

    输出:

    对应每个测试案例,

    输出旋转数组中最小的元素。

    样例输入:
    53 4 5 1 2
    样例输出:
    1

    #include <stdio.h>
     
    #define MAX 1000000
     
    int n;
    int data[MAX];
     
    int MinNum(){
        int start = 0;
        int end = n - 1;
        int middle = 0;
        int ans;
        while (data[start] >= data[end]){
            if (end - start == 1)
                return data[end];
            middle = ((end - start) >> 1) + start;
            if (data[start] == data[middle] && data[middle] == data[end]){
                ans = data[middle];
                for (++start; start <= end; ++start)
                    if (ans > data[start])
                        ans = data[start];
                return ans;
            }
            if (data[middle] >= data[start])
                start = middle;
            else if (data[middle] <= data[end])
                end = middle;
        }
        return data[start];
    }
     
    int main(void){
        int i;
        while (scanf("%d", &n) != EOF){
            for (i = 0; i < n; ++i)
                scanf("%d", &data[i]);
            printf("%d
    ", MinNum());
        }
        return 0;
    }


    参考资料:何海涛 -- 程序员面试题精选100题(42)-旋转数组的最小元素[算法]


  • 相关阅读:
    淘宝网六个质量属性场景
    架构漫谈阅读笔记2
    poj 3304
    poj 2318
    bzoj 4008
    任意模数NTT
    CF623E
    CF712E
    bzoj 1925
    bzoj 4710
  • 原文地址:https://www.cnblogs.com/liushaobo/p/4373743.html
Copyright © 2011-2022 走看看