leetcode 81 搜尋旋轉排序陣列 II

2021-10-08 09:33:33 字數 1722 閱讀 2767

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 輸...