題目描述:
假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。
( 例如,陣列 [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
題目解析:
這道題讓在旋轉陣列中搜尋乙個給定值,若存在返回座標,若不存在返回-1。我們還是考慮二分搜尋法,但是這道題的難點在於我們不知道原陣列在哪旋轉了,我們還是用題目中給的例子來分析,對於陣列[0 1 2 4 5 6 7] 共有下列七種旋轉方法:
0 1 24 5 6 7
7 0 12 4 5 6
6 7 01 2 4 5
5 6 70 1 2 4
4 5 6 70 1 2
2 4 5 67 0 1
1 2 4 56 7 0
二分搜尋法的關鍵在於獲得了中間數後,判斷下面要搜尋左半段還是右半段,我們觀察上面紅色加粗的數字都是公升序的,由此我們可以觀察出規律,如果中間的數小於最右邊的數,則右半段是有序的,若中間數大於最右邊數,則左半段是有序的,我們只要在有序的半段裡用首尾兩個陣列來判斷目標值是否在這一區域內,這樣就可以確定保留哪半邊了,**如下
**實現:
class solutionint left = 0;
int right = nums.length - 1;
while (left <= right) else if (nums[mid] > nums[right]) else
} else else }}
return -1;
}}
時間複雜度: o(log n)
空間複雜度:o(1) ,所有工作都是原地進行的,所以總的記憶體空間是常數級別的。
leetcode33 搜尋旋轉排列陣列
假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,1,2,4,5,6,7 可能變為 4,5,6,7,0,1,2 搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 1 你可以假設陣列中不存在重複的元素。你的演算法時間複雜度必須是 o log n 級別。示例...
leetcode演算法練習 33 搜尋旋轉排序陣列
所有題目源 git位址 題目假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,1,2,4,5,6,7 可能變為 4,5,6,7,0,1,2 搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 1 你可以假設陣列中不存在重複的元素。你的演算法時間複雜度必須是...
LeetCode題目39 搜尋插入位置
給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。你可以假設陣列中無重複元素。示例 1 輸入 1,3,5,6 5 輸出 2示例 2 輸入 1,3,5,6 2 輸出 1示例 3 輸入 1,3,5,6 7 輸出 4示例 4 輸入 1,...