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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

剑指offer 旋转数组的最小数字

發布時間:2024/1/23 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 剑指offer 旋转数组的最小数字 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

把一個數組最開始的若干個元素搬到數組的末尾,我們稱之為數組的旋轉。 輸入一個非遞減排序的數組的一個旋轉,輸出旋轉數組的最小元素。例如數組{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該數組的最小值為1。 NOTE:給出的所有元素都大于0,若數組大小為0,請返回0。

解決方案:

發現前者比后者大 后者就是最小數,因為數組是非減的,防止數組下標越界,單獨拿出一個數的情況,和為空的情況,如下:

import java.util.ArrayList; public class Solution {public int minNumberInRotateArray(int [] array) {int length = array.length;int result = 0; //記住結果if(length == 0){return 0;}if(length >0){for(int i=0;i<length-1;i++){if(array[i] > array[i+1]){result = array[i+1];break;}}}return result;} }

劍指Offer中有這道題目的分析。這是一道二分查找的變形的題目。

旋轉之后的數組實際上可以劃分成兩個有序的子數組:前面子數組的大小都大于后面子數組中的元素

注意到實際上最小的元素就是兩個子數組的分界線。本題目給出的數組一定程度上是排序的,因此我們試著用二分查找法尋找這個最小的元素。

思路:

(1)我們用兩個指針left,right分別指向數組的第一個元素和最后一個元素。按照題目的旋轉的規則,第一個元素應該是大于最后一個元素的(沒有重復的元素)。

但是如果不是旋轉,第一個元素肯定小于最后一個元素。

(2)找到數組的中間元素。

中間元素大于第一個元素,則中間元素位于前面的遞增子數組,此時最小元素位于中間元素的后面。我們可以讓第一個指針left指向中間元素。

移動之后,第一個指針仍然位于前面的遞增數組中。

中間元素小于第一個元素,則中間元素位于后面的遞增子數組,此時最小元素位于中間元素的前面。我們可以讓第二個指針right指向中間元素。

移動之后,第二個指針仍然位于后面的遞增數組中。

這樣可以縮小尋找的范圍。

(3)按照以上思路,第一個指針left總是指向前面遞增數組的元素,第二個指針right總是指向后面遞增的數組元素。

最終第一個指針將指向前面數組的最后一個元素,第二個指針指向后面數組中的第一個元素。

也就是說他們將指向兩個相鄰的元素,而第二個指針指向的剛好是最小的元素,這就是循環的結束條件。

到目前為止以上思路很耗的解決了沒有重復數字的情況,這一道題目添加上了這一要求,有了重復數字。

因此這一道題目比上一道題目多了些特殊情況:

我們看一組例子:{1,0,11,1} 和 {1,1, 1,0,1} 都可以看成是遞增排序數組{0,1,1,1,1}的旋轉。

這種情況下我們無法繼續用上一道題目的解法,去解決這道題目。因為在這兩個數組中,第一個數字,最后一個數字,中間數字都是1。

第一種情況下,中間數字位于后面的子數組,第二種情況,中間數字位于前面的子數組。

因此當兩個指針指向的數字和中間數字相同的時候,我們無法確定中間數字1是屬于前面的子數組(綠色表示)還是屬于后面的子數組(紫色表示)。

也就無法移動指針來縮小查找的范圍。


總結

以上是生活随笔為你收集整理的剑指offer 旋转数组的最小数字的全部內容,希望文章能夠幫你解決所遇到的問題。

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