日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

旋转数组中的最小元素 java_程序员算法面试题之旋转数组的最小值

發布時間:2023/12/19 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 旋转数组中的最小元素 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_程序员算法面试题之旋转数组的最小值的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。