2025年- H63-Lc171--33.搜索旋转排序数组(2次二分查找,需二刷)--Java版
1.题目描述
2.思路
输入:旋转后的数组 nums,和一个整数 target
输出:target 在 nums 中的下标,如果不存在,返回 -1
限制:时间复杂度为 O(log n),所以不能用遍历,必须使用 二分查找!
二分查找:搜索区间必须是“单调有序”的(即 单调递增 或 单调递减)。
(1)首先翻转后的数组,构成两个有序数组。
(2)对第一个有序数组进行二分查找
(3)对第二个有序数组进行二分查找
3.代码实现
public class H33 {public int search(int[] nums, int target) {int left=0;int right=nums.length-1;//对于空数组直接返回-1if(nums==null||nums.length==0){return -1;}while(left<=right){int mid=left+(right-left)/2;//1.直接找到目标返回if(nums[mid]==target){return mid;}// 2. 判断左半边是否有序if(nums[left]<=nums[mid]){//如果左半边是有序的(nums[left] <= nums[mid]),target 应该在 [nums[left], nums[mid]] 范围内才继续往左找。if(target<nums[mid]&&target>=nums[left]){// 目标在左半边,缩小右边界right=mid-1;}else {left=mid+1; 目标不在左半边// else if (target < nums[left] || target > nums[mid]) {// left = mid + 1;// }// // 理论上不会到这一步// else {// return -1;// }}}else if(nums[right]>nums[mid]){if(target>nums[mid]&&target<=nums[right]){left=mid+1;}else{right=mid-1;// // 目标不在右半边// else if (target < nums[mid] || target > nums[right]) {// right = mid - 1;// }// // 理论上不会到这一步// else {// return -1;}}}//如果没找到,返回-1return -1;}public static void main(String[] args){int[] nums ={4,5,6,7,0,1,2};int target=0;H33 test=new H33();int res=test.search(nums,target);System.out.print(res);}}