搜尋旋轉排序陣列

2022-03-12 15:18:10 字數 1057 閱讀 7501

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

可以將陣列從中間分開成左右兩部分的時候,一定有一部分陣列是有序的。拿示例來看,我們從 6 這個位置分開以後陣列變成了 [4, 5, 6] 和 [7, 0, 1, 2] 兩個部分,其中左邊 [4, 5, 6] 這個部分的陣列是有序的,其他也是如此。

所以可以在常規二分搜尋的時候檢視當前 mid 為分割位置分割出來的兩個部分 [l, mid] 和 [mid + 1, r] 哪個部分是有序的,並根據有序的那個部分確定我們該如何改變二分搜尋的上下界,因為我們能夠根據有序的那部分, 判斷出 target 在不在這個部分:

如果 [l,  mid - 1] 是有序陣列,且 target 的大小滿足 [nums[l], nums[mid]),則我們應該將搜尋範圍縮小至 [l,  mid - 1],否則在 [mid + 1,  r] 中尋找。

如果 [mid,  r] 是有序陣列,且 target 的大小滿足 (nums[mid+1], nums[r]],則我們應該將搜尋範圍縮小至 [mid + 1,  r],否則在 [l,  mid - 1] 中尋找。

public

int search(int nums, int

target)

else

if (nums[left] ==target)

else

if (nums[right] ==target) else if (nums[mid] > nums[0]) else

} else

} else if (nums[mid] < nums[0]) else

} else

}return -1;

}

搜尋旋轉排序陣列

假設有乙個排序的按未知的旋轉軸旋轉的陣列 比如,0 1 2 4 5 6 7 可能成為4 5 6 7 0 1 2 給定乙個目標值進行搜尋,如果在陣列中找到目標值返回陣列中的索引位置,否則返回 1。你可以假設陣列中不存在重複的元素。分析 特殊的陣列搜尋某一元素問題,二分法。這一題的難點在於如何尋找二分的...

搜尋旋轉排序陣列

假設有乙個排序的按未知的旋轉軸旋轉的陣列 比如,0 1 2 4 5 6 7 可能成為4 5 6 7 0 1 2 給定乙個目標值進行搜尋,如果在陣列中找到目標值返回陣列中的索引位置,否則返回 1。樣例 給出 4,5,1,2,3 和target 1,返回 2 給出 4,5,1,2,3 和target 0...

搜尋旋轉排序陣列

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