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


    题目来源:牛客网

    题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{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)
  • 相关阅读:
    plink格式数据依据染色体拆分数据、依据染色体合并数据
    Linux系统中date命令
    linux系统 awk 命令依据列字段进行数据匹配
    linux系统中如何将多行数据转化为一行数据
    R语言中sort函数的用法
    各个阶段要读的书
    一个分配固定大小块的内存池(memory pool) 的例子 FROM POCO
    boost tuple笔记(待续)
    万能数据库查询分析器与EXCEL强强联合进行数据分析
    计算机专业毕业生,求职升学,英语自我介绍
  • 原文地址:https://www.cnblogs.com/xiangfeidemengzhu/p/9140387.html
Copyright © 2020-2023  润新知