【剑指Offer面试编程题】题目1386:旋转数组的最小数字--九度OJ

题目描述:

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

输入:

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

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

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

输出:

对应每个测试案例,

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

样例输入:

	5
	3 4 5 1 2

样例输出:

1

【解题思路】本题可以采用投机取巧的方法来完成,由于所有输入数据都必须要读入,题目的旋转数组的最小元素即可以看做从所有输入元素中寻找最小元素。这样的话,我们可以再输入元素的同时确定最小元素,如果当前输入元素比目标元素小,更新目标元素为当前输入值,继续输入。输入完成后,最小元素的值将保存在目标元素里面。

当然,本题的初衷不是这样的。本题的输入应该是第一个递增序列加上第二递增序列,而最小的元素即第二个递增序列的头元素。所以寻找到第二个递增序列的头元素即可解答该题。第二个递增序列的头元素也很好找,当发现当前输入的元素比之前的元素小时,该元素即为所找元素。

AC code:

#include <cstdio>
using namespace std;
 
int main()
{
  int n,tt,recod=10000002;
  while(scanf("%d",&n)!=EOF)
  {
    recod=10000002;
    for(int i=0;i<n;++i)
    {
      scanf("%d",&tt);
      if(tt<recod)
        recod=tt;
    }
    printf("%d\n",recod);
  }
  return 0;
}
/**************************************************************
    Problem: 1386
    User: huo_yao
    Language: C++
    Result: Accepted
    Time:650 ms
    Memory:1020 kb
****************************************************************/
题目链接:http://ac.jobdu.com/problem.php?pid=1386

posted @ 2014-12-18 21:28  huoyao  阅读(128)  评论(0编辑  收藏  举报