列表

详情


XM20. 旋转数组中的最小元素

描述

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

输入描述

一个排好序的数组的一个旋转
数组长度不超过1000000

输出描述

该数组的最小值

示例1

输入:

3 4 5 1 2

输出:

1

原站题解

C++ 解法, 执行用时: 28ms, 内存消耗: 4648KB, 提交时间: 2021-08-29

#include <iostream>
#include <vector>
using namespace std;

int main(){
    vector<int> array;
    char ch;
    int num = 0;
    bool flag = true;
    while((ch = getchar()) != '\n'){
        
        if( ch == '-' ){
            flag = false;
        }
        else if(ch != ' '){
            num = 10 * num + (ch - '0');
        } else {
            if( flag )
                array.push_back(num);
            else
                array.push_back(num*-1);
            num = 0;
            flag = true;
        }
    }
    array.push_back(num);
    
    int n = array.size();
    int le = 0;
    int ri = n-1;
    if( array[le] <array[ri] ){
        cout<<array[le];
        return 0;
    }
    while( le <ri ){
        if( array[le] <array[ri] ){
            break;
        }
        int mid = ((ri-le)>>1)+le;
        if( array[le] <array[mid] ){
            le = mid+1;
        }else if( array[le] >array[mid] ){
            ri = mid;
        }else{
            le++;
        }
    }
    cout<<array[le];
    return 0;
}

C++ 解法, 执行用时: 37ms, 内存消耗: 4696KB, 提交时间: 2020-08-12

#include <bits/stdc++.h>
      
using namespace std;
      
void read(vector <int>& vec){
    char ch;
    int num = 0;
    while((ch = getchar()) != '\n'){
        if(ch != ' '){
            num = 10 * num + (ch - '0');
        } else {
            vec.push_back(num);
            num = 0;
        }
    }
    vec.push_back(num);
}
      
      
int main(){
    vector <int> vec;
    read(vec);
    int mid = -1;
    for (int i = 0; i < vec.size() - 1; i++){
        if(vec[i] > vec[i + 1]){
                mid = i + 1;
                break;
        }
    }
    if(mid == -1){
        cout << vec[0] << "\n";
    } else {
        cout << vec[mid] << "\n";
    }
    return 0;
}

上一题