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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/19 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 旋转数组中的最小元素 java_程序员算法面试题之旋转数组的最小值 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文參考書籍 《劍指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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。