旋转数组中的最小元素 java_程序员算法面试题之旋转数组的最小值
本文參考書籍 《劍指offer》 作者何海濤
01 題目:數組最小值
把一個數組最開始的若干個元素搬到數組的末尾,我們稱之為數組的旋轉。
輸入一個遞增排序的數組,輸出旋轉數組的最小元素。例如數組{3,4,5,1,2}是{1,2,3,4,5}的旋轉數組,該數組的最小值為1。
02 解題過程
解法1:最直觀的解法,就是遍歷數組找到最小元素,這種方式的時間復雜度為o(n)
解法2:遞增數組的旋轉數組,那么旋轉之后的兩部分仍然是遞增的,如:
我們可以利用二分查找做此題,取start,end為數組開始和結束,使得start和end之間不斷逼近,直到找到最小值,mid=(start+end)/2
(1)if arr[mid] >= arr[start] 說明mid值在左邊遞增數組上,此時 start=mid,讓start趨近最小值
(2)if arr[mid] <= arr[end] 說明mid定位在右面的遞增數組上,此時 end=mid 向左趨緊最小值
(3) 結束條件:當start==end-1時結束判斷 end即為此時的最小值的位置
(4) 判斷條件:按照題意 {1,2,3,4,5}也是{1,2,3,4,5}的旋轉數組,所以判斷條件應該是arr[start] >= arr[end],且初始化mid=start,start=0, end=arr.length-1
03 例外解析
數組 {0,1,1,1,1}的兩個旋轉數組如下
此數組也是遞增數組,但是它的兩個旋轉數組, 沒有辦法確定最小值在左面還是在右面,即arr[start]=arr[mid]=arr[end]時沒有辦法確定數組最小值在哪邊。故此時只能循環遍歷數組。
04 代碼實現
public class RotatedArrayMinValue { /** * 旋轉數組的最小數字 * 把一個數組最開始的若干個元素搬到數組的末尾,我們稱之為數組的旋轉。 * 輸入一個遞增排序的數組,輸出旋轉數組的最小元素 */ public static int getMinOfRotateArray (int[] arr) { if (arr == null || arr.length == 0) { throw new RuntimeException("數組為空"); } int start = 0; int end = arr.length - 1; int indexMid = start; while (arr[start] >= arr[end]) { if (start == end - 1) { indexMid = end; break; } indexMid = (start + end) / 2; //無法判斷是在左半部分還是在有半部分 if (arr[start] == arr[indexMid] && arr[end] == arr[indexMid]) { return getMin(arr, start, end); } if (arr[start] <= arr[indexMid]) { // 說明在前半部分 start = indexMid; }else if (arr[end] >= arr[indexMid]) { // 說明在后半部分 end = indexMid; } } return arr[indexMid]; } public static int getMin(int []arr, int start, int end) { int min = arr[start]; for (int i = start + 1; i <= end; i ++) { if (arr[i] < min) { min = arr[i]; } } return min; } public static void main(String[] args) { int []arr= new int[]{1,2,3,4,5}; System.out.println(getMinOfRotateArray(arr)); int []arr1= new int[]{1,1,0,1,1}; System.out.println(getMinOfRotateArray(arr1)); int []arr2= new int[]{1,0,1,1, 1}; System.out.println(getMinOfRotateArray(arr2)); int []arr3= new int[]{1,1,1,0,1}; System.out.println(getMinOfRotateArray(arr3)); int []arr4= new int[]{6,7,8,1,2,3,4,5,6}; System.out.println(getMinOfRotateArray(arr4)); int []arr5= new int[]{6}; System.out.println(getMinOfRotateArray(arr5)); }}總結
以上是生活随笔為你收集整理的旋转数组中的最小元素 java_程序员算法面试题之旋转数组的最小值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 比亚迪称超级混动车订单饱满,混动的产品力
- 下一篇: VAIO 全新定番系列笔记本 F14 /