輸出非減排序數組旋轉后的最小值


題目描述:

把一個數組最開始的若干個元素搬到數組的末尾,我們稱之為數組的旋轉。
輸入一個非減排序的數組的一個旋轉,輸出旋轉數組的最小元素。 例如數
組{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]就是最小值,輸出即可。

3.思路2最好情況遍歷一次,最差情況遍歷n次,我想到一種思路:

    假設旋轉后的數組為array[],其最大索引為end,最小值為min,將數組按min的左右分為左區和右區,

    其中左區滿足兩個條件: array[i] > array[end]    限制了該元素在左邊

                array[i] <= array[i + 1] 限制了該元素不是左區的邊界值

    其中右區滿足兩個條件: array[i] < array[0]      限制了該元素在右邊

                array[i] >= array[i - 1] 限制了該元素不是右區的邊界值

        因此除了上述情況就只剩下左區邊界和右區邊界了,就很好得到最小值了。

具體代碼:

 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 }

總結:

最后一種思路效率較高

                                 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM