码迷,mamicode.com
首页 > 编程语言 > 详细

剑指OFFER之旋转数组的最小数字

时间:2014-12-08 22:38:27      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   ar   color   os   sp   for   strong   

题目描述:

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{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


二分法的思想:
1.如果数组内的元素实际上没有旋转,如1 2 3 4 5,那么就直接输出arr[indexMid],
 这也是为什么indexMid初始化为index1的原因。
2.设置2个指针(数组下标)index1和index2,分别初始化为0和n-1;讨论:
 如果index1和index2的中间值大于或者等于index1,说明中间值仍旧在第一个递增数组内,所以
 把中间值的下标赋值给index1;
 如果index1和index2的中间值小于或者等于index2,说明中间值在第二个递增数组内,把中间值
 的下标赋值给index2;
 直到index1和index2相邻的时候,index2指向的就是最小值
3.考虑特殊情况:假设序列1 0 1 1 1,这个时候按照上面的来中间值等于index1,那么会把2赋值给index1,
 这样一来已经错了。同理,考虑序列1 1 1 0 1;所以当中间值既等于arr[index1]又等于arr[index2],
 只好把数组遍历一遍找出最小值了。



Code:
#include <iostream>
 
using namespace std;
int OrderFind(int *arr,int n){
    int result=arr[0];
    for(int i=1;i<n;++i){
        if(arr[i]<result){
            result=arr[i];
        }
    }
    return result;
}
 
int arr[1000010];
 
int main()
{
   int n;
   while(cin>>n)!=EOF){
        for(int i=0;i<n;++i){
            cin>>arr[i];
        }
        int index1=0;
        int index2=n-1;
        int indexMid=index1;
        bool flag=true;
        while(arr[index1]>=arr[index2]){
            if(index2-index1==1){
                indexMid=index2;
                break;
            }
            int indexMid=(index1+index2)/2;
            if(arr[index1]==arr[index2]&&arr[index1]==arr[indexMid]){
                cout<<OrderFind(arr,n)<<endl;
                flag=false;
                break;
            }
            if(arr[indexMid]>=arr[index1]){
                index1=indexMid;
            }
            if(arr[indexMid]<=arr[index2]){
                index2=indexMid;
            }
        }
        if(flag==true){
            cout<<arr[indexMid]<<endl;
        }
   }
   return 0;
}
 
/**************************************************************
    Problem: 1386
    User: lcyvino
    Language: C++
    Result: Accepted
    Time:670 ms
    Memory:5424 kb
****************************************************************/

 

剑指OFFER之旋转数组的最小数字

标签:style   blog   io   ar   color   os   sp   for   strong   

原文地址:http://www.cnblogs.com/Murcielago/p/4152046.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!