這個題想了想就會做,只是細節真的能卡死人,找了好久的bug。甚至我懷疑我現在的代碼可能還有錯,只是沒例子測出來。
假設按照升序排序的數組在預先未知的某個點上進行了旋轉。
( 例如,數組?[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
思路:先二分找到旋轉點,然后確定在旋轉點左邊查還是右邊查,再二分查找目標。
需要注意的細節在代碼中標注
class Solution {public int search(int[] nums, int target) {if(nums.length==0)return -1;//坑1if(nums.length==1){//坑2if(nums[0]==target)return 0;return -1;}int left=0;int right=nums.length-1;int index=nums.length-1;//旋轉邊界,坑3,初始化別的值是錯的//確定旋轉邊界while(left<=right){int mid=(right-left)/2+left;if (mid==nums.length-1 || nums[mid] > nums[mid + 1]){//坑4,不加第一個條件會越界index = mid+1;break;}else if(nums[left]<=nums[mid]){//坑5,記得加=left=mid+1;}else{right=mid-1;}}//確定在哪邊二分查找if(target>=nums[0]){//坑6,記得加等于left=0;right=index-1;}else{left=index;right=nums.length-1;}//查找while(left<=right){//坑7,mid直接(right+left)/2可能超過int范圍int mid=(right-left)/2+left;if(nums[mid]<target){left=mid+1;}else if(nums[mid]>target){right=mid-1;}else{return mid;}}return -1;}
}
?