有序遞增數組循環右移k位(k未知),查找目標值target的索引,要求O(log n)。
旋轉數組特性:**至少一半是有序的**。
public int search(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) return mid;
// 左半邊有序
if (nums[left] <= nums[mid]) {
if (nums[left] <= target && target < nums[mid])
right = mid - 1; // target在左半邊
else
left = mid + 1; // target在右半邊
}
// 右半邊有序
else {
if (nums[mid] < target && target <= nums[right])
left = mid + 1; // target在右半邊
else
right = mid - 1; // target在左半邊
}
}
return -1;
}
| 條件 | 含義 | target範圍 | 縮小區間 |
|---|---|---|---|
nums[left] <= nums[mid] | 左半邊有序 | [left, mid) | 在範圍內→right=mid-1,否則left=mid+1 |
| else | 右半邊有序 | (mid, right] | 在範圍內→left=mid+1,否則right=mid-1 |