旋转数组中的最小元素 java_程序员算法面试题之旋转数组的最小值
本文參考書籍 《劍指offer》 作者何海濤
01 題目:數(shù)組最小值
把一個數(shù)組最開始的若干個元素搬到數(shù)組的末尾,我們稱之為數(shù)組的旋轉(zhuǎn)。
輸入一個遞增排序的數(shù)組,輸出旋轉(zhuǎn)數(shù)組的最小元素。例如數(shù)組{3,4,5,1,2}是{1,2,3,4,5}的旋轉(zhuǎn)數(shù)組,該數(shù)組的最小值為1。
02 解題過程
解法1:最直觀的解法,就是遍歷數(shù)組找到最小元素,這種方式的時間復(fù)雜度為o(n)
解法2:遞增數(shù)組的旋轉(zhuǎn)數(shù)組,那么旋轉(zhuǎn)之后的兩部分仍然是遞增的,如:
我們可以利用二分查找做此題,取start,end為數(shù)組開始和結(jié)束,使得start和end之間不斷逼近,直到找到最小值,mid=(start+end)/2
(1)if arr[mid] >= arr[start] 說明mid值在左邊遞增數(shù)組上,此時 start=mid,讓start趨近最小值
(2)if arr[mid] <= arr[end] 說明mid定位在右面的遞增數(shù)組上,此時 end=mid 向左趨緊最小值
(3) 結(jié)束條件:當(dāng)start==end-1時結(jié)束判斷 end即為此時的最小值的位置
(4) 判斷條件:按照題意 {1,2,3,4,5}也是{1,2,3,4,5}的旋轉(zhuǎn)數(shù)組,所以判斷條件應(yīng)該是arr[start] >= arr[end],且初始化mid=start,start=0, end=arr.length-1
03 例外解析
數(shù)組 {0,1,1,1,1}的兩個旋轉(zhuǎn)數(shù)組如下
此數(shù)組也是遞增數(shù)組,但是它的兩個旋轉(zhuǎn)數(shù)組, 沒有辦法確定最小值在左面還是在右面,即arr[start]=arr[mid]=arr[end]時沒有辦法確定數(shù)組最小值在哪邊。故此時只能循環(huán)遍歷數(shù)組。
04 代碼實現(xiàn)
public class RotatedArrayMinValue { /** * 旋轉(zhuǎn)數(shù)組的最小數(shù)字 * 把一個數(shù)組最開始的若干個元素搬到數(shù)組的末尾,我們稱之為數(shù)組的旋轉(zhuǎn)。 * 輸入一個遞增排序的數(shù)組,輸出旋轉(zhuǎn)數(shù)組的最小元素 */ public static int getMinOfRotateArray (int[] arr) { if (arr == null || arr.length == 0) { throw new RuntimeException("數(shù)組為空"); } 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)); }}總結(jié)
以上是生活随笔為你收集整理的旋转数组中的最小元素 java_程序员算法面试题之旋转数组的最小值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 比亚迪称超级混动车订单饱满,混动的产品力
- 下一篇: 一个高质量的程序应具备哪些条件?_如何开