3道旋轉有序陣列題81 153 154

2021-10-04 19:24:32 字數 1190 閱讀 3157

和33題差不多,只是這個陣列中含有重複值,然後目標值存在就返回true,否則返回false。所以情況複雜一點

當首,尾和中值都相等時不好判斷左邊有序還是有序,所以這種情況直接將首尾去掉,不影響判斷

當首尾,中值不全相等時就和33題的判斷差不多了,即中值小於尾值時,右邊有序;

中值大於尾值時,左邊有序;但是

如果相等,那麼說明右半邊所有值都相等,那直接讓r = m

然後就這樣迴圈

public

boolean

search

(int

nums,

int target)

//右邊有序

else

if(nums[m]

< nums[r -1]

)else

if(nums[m]

> nums[r -1]

)else

}return

false

;}

找到旋轉有序陣列中最小值。(其實前兩題也可以先找到最小值,然後判斷target所在的區間,這樣逐步縮小範圍進行查詢)

這題主要一點是迴圈區間不太一樣,我一般是用l = 0,r = length,nums[r-1]這樣。但是如果這樣就不太好判斷最小值在中間的情況,比較麻煩,所以改為l = 0,r = length - 1

然後就繼續分情況討論嘛,首先如果最左值小於最右值,說明沒有旋轉,直接返回最左值;

然後如果中值比最左值小,最小值在左邊(包括中值,第一步那樣設定r的區間就是為了這種情況下劃分區間後在左邊區間還包含中值)

否則最小值在右邊

這樣迴圈直到區間長度為1

public

intfindmin

(int

nums)

return nums[l]

;}

是上一題的高階版,只是序列中存在重複值

思路就結合上面兩題的想法,既要處理重複值,還要判斷最小值在哪個區間

只是處理重複值和81題稍微不同,因為81題是找目標值,所以首尾值想同時可以全都去掉,但這題是找最小值,首尾可能都是最小值,所以只去掉尾部

public

intfindmin

(int

nums)

return nums[l]

;}

刷題筆記 旋轉有序陣列

leetcode 四道旋轉有序陣列相關的題 1 找到陣列的最小值 leetcode154 陣列有重複 leetcode153 陣列無重複 和nums right 比較 nums mid nums right 左邊有序 left mid 1 跟左邊比,可能會錯過最小值 兩個問題共享同乙份 def fi...

有序陣列旋轉的問題

一般情況下我們的第一反應肯定是遍歷此陣列,但這肯定不是我們所期望的,因為此陣列是有序陣列旋轉而成,所以我們此時應該想到用二分法來尋找陣列中的最小值。假設我們給定遞增陣列 旋轉後的陣列有下面幾種形式 通過觀察可以發現,在經過旋轉後的陣列在尋找最小值的過程中0的前面的數總是大於0後面的數,所以我們可以以...

leetcode刷題(陣列)3 搜尋旋轉排序陣列

假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,1,2,4,5,6,7 可能變為 4,5,6,7,0,1,2 搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 1 你可以假設陣列中不存在重複的元素。你的演算法時間複雜度必須是 o log n 級別。cl...