zoukankan      html  css  js  c++  java
  • 旋转数组的最小数字

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


    算法思路:

    1.旋转数组的特点就是一个数组为两个有序的数组,这里以升序为例
    2.将数组的start和end获得,求mid,然后用numbers[mid]分别和numbers[start],numbers[end]比较
    如果numbers[mid]>=numbers[start]:start=mid,循环比较mid之后的数组
    如果numbers[mid]<=numbers[end]: end=mid,循环比较mid之前的数组
    3.直到start和end相邻的时候,此时numbers[end]为最小的数字
    注意:当numbers[mid],numbers[start],numbers[end]三个都相等的时候,应该采用顺序遍历的方式找到最小值


    #include<iostream>
    using namespace std;
    int shunxu(int* numbers,int start,int end);
    int Min(int *numbers,int length) throw (exception)
    {
        if(numbers==NULL||length<=0)
            throw exception("参数错误!");
        int start=0,end=length-1;//start指向前面的有序数组的的下标,end指向后面有序数组的下标
        int mid=start;//将mid初始化为start,如果是数组没有旋转不进入while循环,直接return numbers[0]
        while(true)
        {
            if(start-end==-1)//start与end相差1时候则证明start为最大的数,end为最小的数
            {
                mid=end;
                break;
            }
            mid=(start+end)/2;
            //如果numbers[mid],numbers[start],numbers[end]相等的话,需要顺序遍历
            if(numbers[mid]==numbers[start]&&numbers[mid]==numbers[end])
            {
                return shunxu(numbers,start,end);
            }
            if(numbers[mid]>=numbers[start])//此时表示最小数在mid后面
                start=mid;
            else if(numbers[mid]<=numbers[end])//此时表示最小数在mid前面
                end=mid;
        }
        return numbers[mid];
    }
    //顺序遍历数组找最小值
    int shunxu(int* numbers,int start,int end)
    {
        int min=numbers[start];
        for(int i=start+1;i<=end;i++)
        {
            if(min>numbers[i])
                min=numbers[i];
        }
        return min;
    }
    int main()
    {
        int a[20]={1,1,1,0,1};
        cout<<Min(a,5);
        return 0;
    }

    运行结果:

     
  • 相关阅读:
    团队编程项目作业2-爬虫豆瓣top250项目代码设计规范
    《团队-爬取豆瓣电影TOP250-设计文档》
    个人编程作业1-GIT应用
    团队-爬取豆瓣Top250-开发环境搭建过程
    课后作业-阅读任务-阅读提问-1
    20170914-构建之法:现代软件工程-阅读笔记
    结对-贪吃蛇开发环境搭建过程
    结对-贪吃蛇游戏设计文档
    结对-结对编程项目作业名称-需求分析
    团队编程项目自我介绍
  • 原文地址:https://www.cnblogs.com/runninglzw/p/4491201.html
Copyright © 2011-2022 走看看