一、題目描述
把一個數組最開始的若干個元素搬到數組的末尾,我們稱之爲數組的旋轉。 輸入一個非減排序的數組的一個旋轉,輸出旋轉數組的最小元素。 例如數組{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)的時間複雜度
}
};
如有問題歡迎評論區指出,謝謝大家:)