每日刷題 搜尋旋轉排序陣列II

2021-09-27 10:28:41 字數 1354 閱讀 7078

假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。注意,該陣列可能存在重複元素。

( 例如,陣列 [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

對於不含重複元素的旋轉陣列的搜尋,我們可以將時間複雜度壓縮到 o(logn) 量級,但一旦存在重複元素,在極端情況下,會使得執行時間達到線性時間。(因為無法判斷重複元素的部分在左側還是在右側)

方法一:線性查詢。

遍歷陣列,尋找 target.

方法二:二分查詢。

若 nums[left] < nums[right], 此時沒有發生旋轉,按照一般的二分法處理即可;(見 norotated 函式)

若 nums[left] > nums[right], 此時一定發生了旋轉,按照搜尋旋轉陣列的二分法處理即可;(見 yesrotated 函式)

若 nums[left] == nums[right], 這裡就有一些糾結了,例如 [1,1,1,1,1,1,1], [1,1,1,1,1,3,1] 和 [1,3,1,1,1,1,1] , 無法區分旋轉的區間到底是否發生了旋轉,也無法區分旋轉的區間在左側還是右側,此時,為了方便處理,可以將 left++, 這樣處理可能到達極端情況,即退化為線性時間。

**:

class

solution

void

yesrotated

( vector<

int>

& nums,

int& target,

int& left,

int& right,

int& middle)

bool

search

(vector<

int>

& nums,

int target)

else

if( nums[left]

> nums[right]

)//發生旋轉

yesrotated

( nums, target, left, right, middle);}

return left < nums.

size()

&& nums[left]

== target;}}

;

LeetCode刷題 搜尋旋轉排序陣列 II

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

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

lintcode刷題 搜尋旋轉排序陣列

原題如下 搜尋旋轉排序陣列 假設有乙個排序的 按未知的旋轉軸旋轉的 陣列 比如,0 1 2 4 5 6 7 可能成為 4 5 6 7 0 1 2 給定乙個目標值進行搜尋,如果在陣列中找到目標值返回陣列中的索引位置,否則返回 1。你可以假設陣列中不存在重複的元素。您在真實的面試中是否遇到過這個題?ye...