把一個數組最開始的若干個元素搬到數組的末尾,咱們稱之爲數組的旋轉。
輸入一個非減排序的數組的一個旋轉,輸出旋轉數組的最小元素。 例如數
組{3,4,5,1,2}爲{1,2,3,4,5}的一個旋轉,該數組的最小值爲1。 NOTE:給出
的全部元素都大於0,若數組大小爲0,請返回0。數組
1.遍歷整個數組,找到最小值,經過比較找到最小值,該方法太蠻力。優化
2.根據數組是非減排序數組旋轉得來,能夠在遍歷的時候優化一下,遍歷直到a[i]>a[i+1];此時a[i+1]就是最小值,輸出便可。spa
3.思路2最好狀況遍歷一次,最差狀況遍歷n次,我想到一種思路:code
假設旋轉後的數組爲array[],其最大索引爲end,最小值爲min,將數組按min的左右分爲左區和右區,blog
其中左區知足兩個條件: array[i] > array[end] 限制了該元素在左邊排序
array[i] <= array[i + 1] 限制了該元素不是左區的邊界值
索引
其中右區知足兩個條件: array[i] < array[0] 限制了該元素在右邊class
array[i] >= array[i - 1] 限制了該元素不是右區的邊界值test
所以除了上述狀況就只剩下左區邊界和右區邊界了,就很好獲得最小值了。效率
1 public class test6 { 2 public static void main(String[] args) { 3 int arr[] = new int[] { 4, 5, 6, 7, 8, 8, 9, 10, 2, 2, 3 };//此處只列舉一種狀況爲了方便 4 int a = minNumberInRotateArray(arr); 5 System.out.println(a); 6 } 7 8 public static int minNumberInRotateArray(int[] array) { 9 int a = 0;// 變量記錄待返回的最小數 10 if (array.length == 0)// 若是數組爲空返回0 11 return a; 12 int i = array.length / 2; 13 while (i > 0 && i < array.length) {// 在左區內 14 if (array[i] > array[array.length - 1] && array[i] <= array[i + 1]) { 15 i++; 16 } else if (array[i] < array[0] && array[i] >= array[i - 1]) {// 在右區內 17 i--; 18 } else { // 正好是左區或右區的邊界,不知足是左區內或右區內了 19 // 此時拿到的array[i]是邊界值,多是左區的最大值或右區的最小值,判斷一下便可 20 a = array[i] > array[i + 1] ? array[i + 1] : array[i]; 21 break; 22 } 23 } 24 return a; 25 26 } 27 }
最後一種思路效率較高