假設按照升序排序的數組在預先未知的某個點上進行了旋轉。算法
( 例如,數組 [0,1,2,4,5,6,7] 可能變爲 [4,5,6,7,0,1,2] )。數組
搜索一個給定的目標值,若是數組中存在這個目標值,則返回它的索引,不然返回 -1 。spa
你能夠假設數組中不存在重複的元素。code
你的算法時間複雜度必須是 O(log n) 級別。排序
示例 1:索引
輸入: nums = [4,5,6,7,0,1,2], target = 0
輸出: 4
複製代碼
示例 2:get
輸入: nums = [4,5,6,7,0,1,2], target = 3
輸出: -1
class Solution {
public int search(int[] nums, int target) {
int left = 0 , right = nums.length - 1;
while( left <= right ){
int mid = ( left + right ) / 2;
if( nums[ mid ] == target ) return mid;
if( nums[ mid ] >= nums[ left ] ){
if( target < nums[ mid ] && target >= nums[ left ]){
right = mid - 1;
}else{
left = mid + 1;
}
}else{
if( target < nums[ left ] && target > nums[ mid ] ){
left = mid + 1;
}else{
right = mid - 1;
}
}
}
return -1;
}
}
複製代碼
解題思路: 對數組進行二分查找 , 由於是旋轉後的數組,因此須要分爲如下幾種狀況:一、mid的值等於目標值,返回 二、mid的值大於等於left值(即從left 到 mid爲正常遞增的序列) ,若是 目標值在 left - mid這個範圍中 , 則 right = mid - 1 ;不然 往mid + 1 - right 範圍查找 三、若是mid值小於left , 而且目標值小於left值且目標值大於當前mid值,往右邊找 ,不然往左邊找 。 注意邊界條件有=。io