zoukankan      html  css  js  c++  java
  • 【算法编程】旋转数组查找最小数字

    题目来源:牛客网

    题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{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)
  • 相关阅读:
    _ 下划线 Underscores __init__
    Page not found (404) 不被Django的exception中间件捕捉 中间件
    从装修儿童房时的门锁说起
    欧拉定理 费马小定理的推广
    线性运算 非线性运算
    Optimistic concurrency control 死锁 悲观锁 乐观锁 自旋锁
    Avoiding Full Table Scans
    批量的单向的ssh 认证
    批量的单向的ssh 认证
    Corrupted MAC on input at /usr/local/perl/lib/site_perl/5.22.1/x86_64-linux/Net/SSH/Perl/Packet.pm l
  • 原文地址:https://www.cnblogs.com/xiangfeidemengzhu/p/9140387.html
Copyright © 2011-2022 走看看