算法题解:旋转数组的最小数字
生活随笔
收集整理的這篇文章主要介紹了
算法题解:旋转数组的最小数字
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
把一個數組最開始的若干個元素搬到數組的末尾,我們稱之為數組的旋轉。輸入一個非遞減排序的數組的一個旋轉,輸出旋轉數組的最小元素。
解題思路
將旋轉數組對半分可以得到一個包含最小元素的新旋轉數組,以及一個非遞減排序的數組。新的旋轉數組的數組元素是原數組的一半,從而將問題規模減少了一半,這種折半性質的算法的時間復雜度為 O(logN)(為了方便,這里將 log2N 寫為 logN)。
此時問題的關鍵在于確定對半分得到的兩個數組哪一個是旋轉數組,哪一個是非遞減數組。我們很容易知道非遞減數組的第一個元素一定小于等于最后一個元素。
通過修改二分查找算法進行求解:
- 當 nums[mid] <= nums[high] 時,表示 [mid, high] 區間內的數組是非遞減數組,[low, mid] 區間內的數組是旋轉數組,此時令 high = mid;
- 否則 [mid + 1, high] 區間內的數組是旋轉數組,令 low = mid + 1。
如果數組元素允許重復,會出現一個特殊的情況:nums[low] == nums[mid] == nums[high],此時無法確定解在哪個區間,需要切換到順序查找。例如對于數組 {1, 1, 1, 0, 1},low、mid 和 high 指向的數都為 1,此時無法知道最小數字 0 在哪個區間。
public int minNumberInRotateArray(int[] arr) {if (arr.length == 0) {return 0;}int low = 0;int high = arr.length - 1;while (low < high) {int mid = low + (high - low) / 2;if (arr[low] == arr[mid] && arr[mid] == arr[high]) {return minNumber(arr, low, high);} else if (arr[mid] <= arr[high]) {high = mid;} else {low = mid + 1;}}return arr[low]; }private int minNumber(int[] arr, int low, int high) {for (int i = low; i < high; i++) {if (arr[i] > arr[i + 1]) {return arr[i + 1];}}return arr[low]; }參考
CyC2018
轉載于:https://www.cnblogs.com/yueshutong/p/11571495.html
總結
以上是生活随笔為你收集整理的算法题解:旋转数组的最小数字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos7安装openjdk8
- 下一篇: spring AOP源码分析(一)