【算法编程】旋转数组查找最小数字

题目来源:牛客网

题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

解题思路:二分法。

C++:35ms 608k

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

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        if (rotateArray.empty()){return 0;}
        // 二分法
        int arr_len = rotateArray.size();
        int left=0, right = arr_len-1;
        if (rotateArray[left]<rotateArray[right]){return rotateArray[left];}// without rotate
        // with rotate
        while (left!=right){
            int media = (left+right)/ 2;
            if (rotateArray[media]>rotateArray[left]){
                left = media;
            }
            else if (rotateArray[media]<rotateArray[left]){
                right = media;
            }
            else{
                left++;
            }
        }
        return rotateArray[left];
    }
};

int main()
{
    Solution obj;
    string x_in;
    vector<int> vec_x;
    while(getline(cin,x_in)){
        istringstream line(x_in);
        while(line){
            int temp=0;
            line>>temp;
            vec_x.push_back(temp);
        }
        vec_x.pop_back();
        //cout<<vec_x.size()<<endl;
        cout << obj.minNumberInRotateArray(vec_x)<<endl;
        vec_x.clear();
    }
    

    cin.get();
    cin.get();
}

Python:994ms 5624k

# -*- coding:utf-8 -*-
import sys
class Solution:
    def minNumberInRotateArray(self, rotateArray):
        arr_len = len(rotateArray)
        if arr_len == 0:
            return 0;
        else:
            # 二分法
            left = 0
            right = arr_len-1
            media = (left+right)/2
            if rotateArray[left]<rotateArray[right]:
                return rotateArray[left]
            while not (media==left):
                if rotateArray[media]>rotateArray[left]:
                    left = media
                elif rotateArray[media]<rotateArray[left]:
                    right = media
                else:
                    left += 1
                media = (left+right)/2
            if rotateArray[left]>rotateArray[right]:
                return rotateArray[right]
            else:
                return rotateArray[left]

if __name__ == '__main__':
    obj = Solution()
    while (1):
        x = raw_input().split()
        print obj.minNumberInRotateArray(x)

猜你喜欢

转载自www.cnblogs.com/xiangfeidemengzhu/p/9140387.html