假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。
( 例如,陣列 [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 先找到有序的一半 ...