旋轉數組的最小數字

一、題目描述

把一個數組最開始的若干個元素搬到數組的末尾,我們稱之爲數組的旋轉。 輸入一個非減排序的數組的一個旋轉,輸出旋轉數組的最小元素。 例如數組{3,4,5,1,2}爲{1,2,3,4,5}的一個旋轉,該數組的最小值爲1。 NOTE:給出的所有元素都大於0,若數組大小爲0,請返回0。

題目來源:旋轉數組的最小數字–nowcoder

二、題目解析

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        /**
         * 先來搞一個取巧的辦法唄,把這個數組排個序,然後返回 rotateArray[0] 不就好了嘛
         * 但是考慮一個效率問題,即使用效率較高的快速排序,時間複雜度也是 O(nlgn)
         * 
         */
#if 0
        sort(rotateArray.begin(),rotateArray.end());
        return rotateArray[0];
#endif
        /**
         * 考慮本題的特性,其實這個數組就是兩部分已經有序的數組嘛,只要找到那個突變的點就可以了
         * 或者直接理解爲一趟選擇排序,找最小的那個元素就好了
         */
        // NOTE:給出的所有元素都大於0,若數組大小爲0,請返回0。
        if (rotateArray.empty())
        {
            return 0;
        }
        // 一遍遍歷找到那個最小的元素
        int min = rotateArray[0];
        for(size_t i = 0; i < rotateArray.size(); ++i)
        {
            if (rotateArray[i] < min)
            {
                min = rotateArray[i];
            }
        }
        
        return min;
        // 目前不知道會不會有其他更神奇的操作,我真的想不到了,畢竟不是完全有序的,遍歷一遍數組就得O(n)的時間複雜度
    }
};

如有問題歡迎評論區指出,謝謝大家:)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章