LeetCode 81搜尋旋轉排序陣列 II

2021-10-01 03:55:43 字數 1305 閱讀 5297

題目傳送門

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

( 例如,陣列 [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、找到中間元素,比較與頭結點的大小,如何大於則前部分為順序陣列,後半部分為旋轉公升序陣列。

2、若中間元素小於頭結點,則後半部分為順序陣列,前半部分為旋轉公升序陣列。

但在這道題中存在一些需要討論的情況:當中間元素等於頭結點(1,3,1,1,1),這時改怎麼判定?既不能說是公升序的,也不能說是旋轉公升序的,這可怎麼辦?

其實我覺得如果中間元素等於頭結點,那麼也肯定等於尾結點,這時我們就不必再去關心後半部分了(前提已經判斷過了a[mid]!=target),這時就只需要二分查詢前半部分元素即可。但這種思路只過去了253/275個資料(其中有乙個資料為(1,1,3)),大概測試用例中中還有未旋轉的數字吧。但後續有想了下,我只考慮了逆時針旋轉(後面的放在頭部了),沒有想到前面的順時針旋轉(1,1,3,1)。

那既然這樣,如果中間元素等於頭結點,那麼這時我們什麼都不會知道(上面已經說了既不知道是順序的還是迴圈順序的),但起碼知道了頭結點不等於target,那麼我們就可以排除這個元素了(low++),這樣就可以避免重複元素對我們二分的干擾了,但是卻有乙個缺陷,就是極端情況下,時間複雜度為o(n),這樣就退化成了線性查詢。

class

solution

else

if(nums[mid]

==nums[high]

) high--

;else

if(nums[mid]

>nums[low]

)else

if(nums[mid]

if(nums[low]

==target||nums[high]

==target)

return

true

;return

false;}

}};

LeetCode81 搜尋旋轉排序陣列 II

二分查詢,但是下面的 在測試用例 3,1 1中出錯。package 牛客刷題.leetcode.查詢.search in rotated sorted array ii created by administrator on 2018 6 28 0028.public class solution ...

LeetCode 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輸出 t...

leetcode81 搜尋旋轉排序陣列 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 輸...