33 搜尋旋轉排序陣列

2022-05-19 16:42:36 字數 1311 閱讀 5467

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

( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。

搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1 。

你可以假設陣列中不存在重複的元素。

你的演算法時間複雜度必須是 o(log n) 級別。

示例 1:

輸入: nums = [4,5,6,7,0,1,2], target = 0

輸出: 4

示例 2:

輸入: nums = [4,5,6,7,0,1,2], target = 3

輸出: -1

題目既然給出演算法時間複雜度必須是 o(log n) 級別,且原陣列是有序變形而來,那麼能想到的第一解決方案是二分查詢

二分查詢

前提:陣列從小到大公升序

"""left\right分別為陣列nums的首末指標, target是要尋找的數"""

while (left <= right):

mid = (left + right) / 2

if (nums[mid] == target):

return mid

if (nums[mid] > target):

right = mid - 1

else

left = mid + 1

# 如果跳出迴圈還沒有找到這個數,說明陣列中沒有target,返回-1

return -1;

目前的陣列nums並不是從小到大排好序的,而是間斷性的有序,如4,5,6,7,0,1,2。這裡仍可以借鑑二分查詢的思想,只不過對mid要增加些許判斷條件

原陣列有序的情況下是0,1,2,3,4,5,6,7,旋轉過後分為幾種情況,即小 大 小、大 小 大的兩種形式,對應位置為letf\mid\right這3個指標。小到大還是正常從小到大的順序,在這一區域中仍可以用正常的二分思想確定left和right。在另一邊大到小的亂序中,這需要根據nums[mid]和邊界值的判斷來確定left和right。詳細注釋給在**中

class solution 

// 如果這段陣列滿足nums[left] > nums[right],那麼說明這段陣列的順序並不是完全從小到大排序的,形如3,4,0,1,2中,3 > 2是成立的

else

else}}

// 前面都沒能返回直至跳出迴圈說明要尋找的數並不在陣列中,返回-1

return -1;

}};

33 搜尋旋轉排序陣列

假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,1,2,4,5,6,7 可能變為 4,5,6,7,0,1,2 搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 1。你可以假設陣列中不存在重複的元素。你的演算法時間複雜度必須是 o log n 級別。示例...

33 搜尋旋轉排序陣列

假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,1,2,4,5,6,7 可能變為 4,5,6,7,0,1,2 搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 1。你可以假設陣列中不存在重複的元素。你的演算法時間複雜度必須是o log n 級別。輸入 ...

33 搜尋旋轉排序陣列

假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,1,2,4,5,6,7 可能變為 4,5,6,7,0,1,2 搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 1。你可以假設陣列中不存在重複的元素。你的演算法時間複雜度必須是 o log n 級別。示例...