81 搜尋旋轉排序陣列 II

2021-09-11 14:48:12 字數 1097 閱讀 4355

假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。

( 例如,陣列 [0,0,1,2,2,5,6] 可能變為 [2,5,6,0,0,1,2] )。

編寫乙個函式來判斷給定的目標值是否存在於陣列中。若存在返回 true,否則返回 false。

示例 1:

輸入: nums = [2,5,6,0,0,1,2], target = 0

輸出: true

示例 2:

輸入: nums = [2,5,6,0,0,1,2], target = 3

輸出: false

(1)方法:暴力法

思路:直接遍歷逐個比較即可;

弊端:有很多不必要的計算,浪費時間;

class solution 

//暴力法,逐個遍歷

private boolean search1(int nums, int target)

return false;

}}

(2)方法:雙指標法

思路:雙指標,乙個開頭乙個結尾,其實不管有序陣列怎麼旋轉,它肯定還是由兩個有序陣列片段組成,頭指標對應的遞增片段,尾指標對應的遞減片段,只需要確定當前目標值屬於哪個片段,然後只遍歷對應該片段即可;

1,先把特殊情況剔除掉,target完全不屬於這兩個片段,返回false;target剛好等於頭尾指標對應的值,返回true即可;

2,target處於頭指標對應的遞增片段,target>nums[start],直接將start+1,只要target比nums[start]大,並且start沒越界,同時還要保證此時指標仍處於該遞增片段,那麼start++,一直重複此操作,直到不滿足條件,然後判斷start指標是否越界以及是該索引的值否和target相等,相等則返回true,否則false;

3,target處於尾指標對應的遞減片段,和頭指標的思路一樣,只是end指標向左移動而已;

注2:具體可以看**

class solution 

//雙指標法

private boolean search2(int nums, int target) else

}}

81 搜尋旋轉排序陣列 II

假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,0,1,2,2,5,6 可能變為 2,5,6,0,0,1,2 編寫乙個函式來判斷給定的目標值是否存在於陣列中。若存在返回 true,否則返回 false。示例 1 輸入 nums 2,5,6,0,0,1,2 target 0 輸...

81 搜尋旋轉排序陣列 II

題目.middle 這是乙個二分查詢的公升級版,我們可以認為,經過旋轉後分成了兩部分,left half和right half,所以每次根據mid所在的位置,淘汰掉一半的資料。千萬不要去尋找旋轉點。這樣會搞得很麻煩 package main import fmt func search nums i...

81 搜尋旋轉排序陣列 II

思路 二分法,肯定能分到有序的一半和無序的一半,如果不在有序的一半那就在無序的那一半裡面 問題在於對於有序的一半的判斷 一開始想當然的,nums left mid就是在左半邊,否則再右半邊,但是這個等號是最難辨別的 因為如果mid是中間的話最難分辨了 class solution 先找到有序的一半 ...