已知一個升序數組在未知點旋轉(如 [4,5,6,7,0,1,2]),查找 target 並返回索引,不存在返回 -1。數組無重複元素。
rotate):從右向左掃描,第一個 nums[i] < nums[i-1] 處即為旋轉點。a[i] = nums[(i+rotate)%n]。idx。(idx + rotate) % n。public int search(int[] nums, int target) {
if (nums.length == 0) return -1;
int rotate = 0;
for (int i = nums.length-1; i > 0; i--)
if (nums[i] < nums[i-1]) { rotate = i; break; }
int[] a = new int[nums.length];
for (int i = rotate; i < nums.length; i++) a[i-rotate] = nums[i];
for (int i = 0; i < rotate; i++) a[i+nums.length-rotate] = nums[i];
int lo = 0, hi = nums.length-1, idx = -1;
while (lo <= hi) {
int mid = (lo+hi)/2;
if (a[mid] > target) hi = mid-1;
else if (a[mid] < target) lo = mid+1;
else { idx = mid; break; }
}
if (idx == -1) return -1;
return (idx + rotate) % nums.length;
}
時間 O(log n),空間 O(n)(可優化為 O(1) 直接在原數組上改良二分)。