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
輸出: true
示例 2:
輸入: nums = [2,5,6,0,0,1,2], target = 3
輸出: false
高階:這是 搜尋旋轉排序陣列 的延伸題目,本題中的 nums 可能包含重複元素。
這會影響到程式的時間複雜度嗎?會有怎樣的影響,為什麼?
這道題是承接33. 搜尋旋轉排序陣列和劍指 offer 11. 旋轉陣列的最小數字這兩道題的方法組合而成的。
首先是搜尋旋轉排序陣列這道題,提供了乙個在區分左右佔優區間之後,再一次區分target目標值是在左區間還是右區間的思路。
劍指這道題,提供了乙個去除重複數字對搜尋的影響。那就是對中,右兩個數進行判斷,區別是左佔優,還是右佔優。但是在中等於右的時候,這個條件就不成立,因為此時可能除了中右相等,可能左中右都相等。待尋找的值可能在左邊,也可能在右邊,例如下面這個例子,所以我們只有逐個縮小區間進行進一步分析。
[0,0,0,0,1,0]
[0,1,0,0,0,0]
這個時候中右,甚至左中右都相等,我們無法直接知道目標值是在左區間還是右區間,所以只有逐個縮小區間範圍。那為什麼是右區間減一了?
首先,中右的值是相等的,我們去掉最右邊的值,在取中值的時候,也相當於中值左移,並且去掉右邊的值,對元素索引沒有影響,如果去掉左邊的,或者中間的值,對元素的索引會產生變化。
class
solution
:def
search
(self, nums: list[
int]
, target:
int)
->
bool
: left, right =0,
len(nums)-1
while left <= right:
mid =
(left + right)//2
if target == nums[mid]
:return
true
if nums[mid]
< nums[right]
:#右佔優
if nums[mid]
< target <= nums[right]
:#目標值在右邊
left = mid +
1else
: right = mid -
1elif nums[mid]
> nums[right]
:#左邊佔優
if nums[left]
<= target < nums[mid]
: right = mid -
1else
: left = mid +
1else
:#中右相等,此時縮小區間
right -=
1return
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 輸...