題目:
假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。
( 例如,陣列 [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
主要思路:
兩個遞增陣列,首先要判斷target是在前面的遞增陣列裡還是後面的遞增陣列裡
在後面的陣列裡,滿足條件:nums[0]>target,所以找到後面陣列的起始(min)和結束(len-1),然後進行二分查詢
在前面的陣列裡的話,滿足條件nums[0]<=target,起始位置:i=0,結束位置:有兩種可能,一種是整個陣列先遞增在遞增,表示第二個陣列不為空,這樣找到min的位置-1就可以直接用二分查詢繼續找了,但若第二個陣列為空的話,j=len-1;所以可以將j初始化為len-1,若findmin(nums)!=0的時候就j=findmin(nums)-1;
對了,還要注意一下陣列為空的情況
需要注意的是:搜尋值的時候有四種情況:<,>,=,不存在,用else的時候一定要慎之又慎!
class solution
else
}return i;
}int search(vector& nums, int target)
if(target==nums[0])
int res;
if(targettarget)
if(nums[mid]target)
if(nums[mid]}
}return -1;
}};
二分搜尋 旋轉陣列
以二分搜尋為基本思路 簡要來說 nums 0 nums mid 0 mid不包含旋轉 且nums 0 target nums mid 時 high 向前規約 nums mid nums 0 0 mid包含旋轉 target nums mid nums 0 時向前規約 target 在旋轉位置到 mi...
旋轉陣列的二分查詢
1 什麼是旋轉陣列 旋轉陣列是將乙個有序陣列的前若干個數旋轉到陣列末尾,例如陣列a 5 那麼陣列b 5 為陣列a的乙個旋轉陣列 2 旋轉陣列的二分查詢之找到給定key 對於給定乙個數key,如何從旋轉陣列中找到key的位置呢?由於旋轉陣列部分有序,故可以利用二分查詢思想來設計演算法,從而達到logn...
旋轉陣列的二分查詢
1.問題描述 已知有序陣列a n 從中間某個位置k k未知,k 1表示整個陣列有序 分開,然後將前後兩部分互換,得到新的陣列,在該新陣列的查詢元素x。如 a 從k 4分開,得到新陣列a 一次二分查詢 二分查詢演算法有兩個關鍵點 1 陣列有序 2 根據當前區間的中間元素與x的大小關係,確定下次二分查詢...