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


    题目描述:

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{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
    ****************************************************************/
  • 相关阅读:
    app测试的一些较为重要的测试点
    adb工作常用命令
    vue中$attrs $listeners你会用吗?
    Vue中组件通信的常用方式
    Vue中watch 的用法
    VUE中使用 async await 将 axios 异步请求同步化处理
    安装spyder记录
    树莓CM3开机连接WIFI
    树莓派搭建seafile服务器备忘
    关于JAVA数据结构_线性表(通过单向链表实现)的学习
  • 原文地址:https://www.cnblogs.com/Murcielago/p/4152046.html
Copyright © 2020-2023  润新知