剑指offer(5) 旋转数组中的最小值

  • 题目描述

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

  • 程序分析:

    数据(1)数据(2)数据(3)数据(4)数据(5)
    12345
    ==========>
    56734
    ======>====>
    84567
    ==>========>
  • 我们通过观察可以得到如果 数据(1)(开始的数据)和 数据(5)(末尾的数据)的大小可以得到,如果1<5,那么整个数组有序。第一个数就是我们要寻找的数。如果1>5,那么最小的数指可定在中间.程序的中间的顺序是一句如第二列的数据4->5增大,第三列7->8增大,那么直到我们遇到顺序相反时,那么就可以获取到我们的数值。

#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        bool flag = true;
        int min = 0;
        int size = rotateArray.size();
        if (rotateArray[0]<rotateArray[size - 1]){
            flag = true;
        }
        else {
            flag = false;
        }
        for (unsigned int i = 0; i< rotateArray.size() - 1; i++){
            if (rotateArray[i]<rotateArray[i + 1]){
                if (flag == true){
                    return rotateArray[i];
                }
            }
            else if (rotateArray[i]>rotateArray[i + 1]){
                if (flag == false){
                    return rotateArray[i + 1];
                }
            }

        }
        return 0;
    }
};


void main()
{
    getchar();
    vector<int> v;
    Solution *so = new Solution();
    for (int i = 1; i < 6; i++)
    {
        printf("%3d", i);
        v.push_back(i);
    }
    int num = so->minNumberInRotateArray(v);
    printf("最小值 %d\n",num);
    vector<int> v1;
    for (int i = 0; i < 5; i++)
    {
        printf("%3d", (7+i)%5+3);
        v1.push_back((7 + i) % 5+3);
    }
    num = so->minNumberInRotateArray(v1);
    printf("最小值 %d\n", num);

    vector<int> v3;
    for (int i = 0; i < 5; i++)
    {
        printf("%3d", (9+ i) % 5 + 4);
        v3.push_back((9+ i) % 5 + 4);
    }
    num = so->minNumberInRotateArray(v3);
    printf("最小值 %d\n", num);

    getchar();
}
  • 结果
    这里写图片描述
  • 这个解决方案在牛客网上运转程序失败,程序段溢出

  • 我们换个方法,我们找到前面的数比后面的数大

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        if(rotateArray.size()==0){
            //printf("no elem in vector");
            return 0;
        }
        for(int i = 0;i< rotateArray.size()-1;i++){
            if(rotateArray[i]>rotateArray[i+1]){

                return rotateArray[i+1];
            }
        }

        return rotateArray[0];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值