【LeetCode】Find Minimum in Rotated Sorted Array 解題報告
阿新 • • 發佈:2017-08-03
consola simple tom adding eve easy java show post
今天看到LeetCode OJ題目下方多了“Show Tags”功能。我覺著挺好,方便剛開始學習的人分類練習。同一時候也是解題時的思路提示。
【題目】
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7
might become 4
5 6 7 0 1 2
).
Find the minimum element.
You may assume no duplicate exists in the array.
【解法】題目比較簡單,直接看代碼吧,可是要想把代碼寫得美麗並不easy啊。
O(n)非常好寫,O(lgn)要好好捋捋思路。
public class Solution { // O(n) simple public int findMin1(int[] num) { int len = num.length; if (len == 1) { return num[0]; } for (int i = 1; i < len; i++) { if (num[i] < num[i-1]) { return num[i]; } } return num[0]; // 尼瑪,看成找中間數了 // if (len % 2 != 0) { //len is odd // return num[(begin+len/2)%len]; // } else { //len is even // return (num[(begin+len/2-1)%len] + num[(begin+len/2)%len]) / 2; // } } // O(lgn) not that good public int findMin2(int[] num) { int len = num.length; if (len == 1) return num[0]; int left = 0, right = len-1; while (left < right) { if ((right-left) == 1) return Math.min(num[left], num[right]); if (num[left] <= num[right]) return num[left]; int mid = (left + right) / 2; if (num[mid] < num[right]) { right = mid; } else if (num[left] < num[mid]) { left = mid; } } return num[left]; } // O(lgn) optimized iteratively public int findMin3(int[] num) { int len = num.length; if (len == 1) return num[0]; int left = 0, right = len-1; while (num[left] > num[right]) { // good idea int mid = (left + right) / 2; if (num[mid] > num[right]) { left = mid + 1; } else { right = mid; // be careful, not mid-1, as num[mid] maybe the minimum } } return num[left]; } // O(lgn) optimized recursively public int findMin(int[] num) { return find(num, 0, num.length-1); } public int find(int[] num, int left, int right) { if (num[left] <= num[right]) { return num[left]; } int mid = (left + right) / 2; if (num[mid] > num[right]) { return find(num, mid+1, right); } return find(num, left, mid); } }
【LeetCode】Find Minimum in Rotated Sorted Array 解題報告