33. 搜索旋转排序数组
题目描述:整数数组 nums 按升序排列,数组中的值 互不相同 。
在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。
给你旋转后的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。
考察重点:二分查找
方法概括:先遍历找到旋转位置,前数组为原数组后半部分,后数组为原数组前半部分,根据target大小选择在哪个数组进行二分查找。
public int search(int[] nums, int target) {int left = 0, right = nums.length - 1;for (; left + 1 <= right && nums[left] < nums[left + 1]; left++) {} //遍历找到旋转的起始位置//对于[4,5,6,7,0,1,2] left目前指向7,right目前指向2if (left == right) { // left right更新为记录待查找数组的左右边界left = 0;} else if (nums[right] >= target) {left++;} else { right = left;left = 0;}while (left <= right) {int mid = left + (right - right) / 2;if (nums[mid] == target) {return mid;}if (target < nums[mid]) {right = mid - 1;}if (target > nums[mid]) {left = mid + 1;}}return -1;
}