假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。注意,該陣列可能存在重複元素。
( 例如,陣列 [0,0,1,2,2,5,6] 可能變為 [2,5,6,0,0,1,2] )。
編寫乙個函式來判斷給定的目標值是否存在於陣列中。若存在返回 true,否則返回 false。
示例:
例 1:對於不含重複元素的旋轉陣列的搜尋,我們可以將時間複雜度壓縮到 o(logn) 量級,但一旦存在重複元素,在極端情況下,會使得執行時間達到線性時間。(因為無法判斷重複元素的部分在左側還是在右側)輸入: nums = [2,5,6,0,0,1,2], target = 0
輸出: true
例 2:
輸入: nums = [2,5,6,0,0,1,2], target = 3
輸出: false
方法一:線性查詢。
遍歷陣列,尋找 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...