一、題目分析
要求:時間複雜度,數組中沒有重複元素,nums是升序,但是可能以未知下標旋轉,查找target的位置
解決:使用二分法,但是要加上條件限制
如果不加改變繼續使用二分法,就會出現上述問題 ,怎麼加上限制條件呢
規律:
所以分爲下面兩種情況,一種是target在mid左邊,一種是target在mid右邊
細分爲三種情況,如果begin<mid,說明這一段是遞增的;如果begin>mid,說明begin--(mid-1)是旋轉區間,當然也是遞增的;如果相等, begin==mid,就要在(mid+1)--end中去尋找
也就是情況分析複雜了一些,實際代碼實現如果思路清晰就不是問題,關鍵就是情況劃分好多種啊,讓人頭大
二、代碼實現
簡化版本,原先分了很多情況,但是網上看了別人的思路,覺得很不錯,簡單明瞭。
public class Solution {
public int search(int[] nums, int target) {
int start = 0;
int end = nums.length-1;
while(start <= end){
int mid = (start + end) / 2;
if(nums[mid] == target)
return mid;
if(nums[start] <= nums[mid]){ //如果鏈表左邊是有序的
if(nums[start] <= target && target < nums[mid]){ //若target在鏈表左邊
end = mid - 1;
}else{
start = mid + 1;
}
} else{ //否則,如果鏈表右邊是有序的
if(nums[end] >= target && target > nums[mid]){
start = mid + 1;
}else{
end = mid-1;
}
}
}
return -1;
}
}