旋转数组

Posted tianzeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了旋转数组相关的知识,希望对你有一定的参考价值。

题目

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

#include <iostream>
using namespace std;

class Solution
{
    public:
        int find_min_elem(int a[],int len);
        int min_order(int a[],int left,int right);
};
int Solution::find_min_elem(int a[],int len)
{
    if(a==nullptr||len<=0)
        return -1;
    
    int left=0;
    int right=len-1;
    int middle=left;
    
    while(a[left]>=a[right])
    {
        if(right-left==1)
        {
            return a[right];
            break;
        }
    
        int middle=(left+right)/2;    
        //特殊测试。 a[left]==a[right]&&a[left]==a[middle]三值相等。只能顺序查找 
        if(a[left]==a[right]&&a[left]==a[middle])
            return min_order(a,left,right);
            
        if(a[left]<a[middle])
            left=middle;
        else
            right=middle;
    }
    return a[middle];
}
int Solution::min_order(int a[],int left,int right)
{
    int res=a[left];
    for(int i=left+1;i<=right;++i)
    {
        if(res>a[i])
            res=a[i];
    }
    return res;
}
int main()
{
    Solution s;
    int a[]={1,0,1,1,1};
    int res=s.find_min_elem(a,sizeof(a)/sizeof(a[0]));
    if(res<0)
        cerr<<"error"<<endl;
    else
        cout<<res<<endl;
    return 0;
}

 

以上是关于旋转数组的主要内容,如果未能解决你的问题,请参考以下文章

Butterknife 片段旋转给出 NullPointer

如何在没有活动旋转的情况下旋转活动内的片段?

旋转后片段字段为空

使用导航抽屉旋转时的片段更改

在我旋转屏幕之前,LiveData 不会加载到片段中

屏幕旋转后Android片段重叠