zoukankan      html  css  js  c++  java
  • 【剑指offer】旋转数组的最小值

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/25335043


        如今对算法真的是由衷地热爱啊,总是忍不住想要A题(本科都没这意识,哎,把时间都浪费在了考试拿奖学金和所谓的学生工作上了),并且数学一直以来都是自己的强项,希望在这方面以后能应用好。尽管在ACM方面还仅仅是个小学生。以后即使工作了,也要把ACM坚持下去。无关乎工作,仅仅关乎兴趣。

        

        依旧是剑指offer上的题目,第8题,在九度OJ上測试通过。

    时间限制:1 秒

    内存限制:32 兆

    题目描写叙述:

    把一个数组最開始的若干个元素搬到数组的末尾。我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。

    比如数组{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
        採用二分查找的策略,重点要考虑一些边界情况:旋转了0元素。即输入的是一个升序排列的数组、仅仅包括一个数字的数组、有非常多反复数字的数组等。

        AC代码:

    #include<stdio.h>
    #include<stdlib.h>
    
    int main()
    {
    	int n;
    	while(scanf("%d",&n) != EOF)
    	{
    		int *A = (int *)malloc(n*sizeof(int));
    		if(A == NULL)
    			exit(EXIT_FAILURE);
    		int i;
    		for(i=0;i<n;i++)
    			scanf("%d",A+i);
    
    		int p1 = 0;
    		int p2 = n-1;
    		int mid = p1;
    		while(A[p1] >= A[p2])
    		{
    			if(p2-p1 == 1)
    			{
    				mid = p2;
    				break;
    			}
    			mid = (p1+p2)/2;
    			//特殊情况,仅仅能顺序查找
    			if(A[p1]==A[mid] && A[p2]==A[mid])
    			{
    				mid = p1;
    				int i;
    				for(i=p1+1;i<=p2;i++)
    				{
    					if(A[mid] > A[i])
    						mid = i;
    				}
    				break;
    			}
    			if(A[mid]>=A[p1])
    				p1 = mid;
    			else if(A[mid]<=A[p2])
    				p2 = mid;
    		}
    		printf("%d
    ",A[mid]);
    		free(A);
    		A = 0;
    	}
    	return 0;
    }

    /**************************************************************
        Problem: 1386
        User: mmc_maodun
        Language: C
        Result: Accepted
        Time:700 ms
        Memory:4820 kb
    ****************************************************************/


  • 相关阅读:
    QAction使用
    QT学后感
    设置背景图片
    获取句柄的方法总结(尤其是对于dll而言)
    unixbench小试
    Java命令行之jar命令
    Java应用程序安装包制作工具简介
    Eclipse使用ant编译时的乱码问题
    Jboss4中使用配置发送邮件
    Exe4j注册码
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5078572.html
Copyright © 2011-2022 走看看