假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。
( 例如,陣列 [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 級別。示例...