(LeetCode)Java 求解搜索旋转排序数组

133 阅读1分钟

一、题目

升序排列的整数数组 nums 在预先未知的某个点上进行了旋转(例如, [0,1,2,4,5,6,7] 经旋转后可能变为 [4,5,6,7,0,1,2] )。

请你在数组中搜索 target ,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。

在这里插入图片描述


解析: 该题可以使用常规的左右指针,左右夹逼找到target。

也可以采用二分搜索的思路:

  • 由于该数组是旋转后的数组,所以首先需要确定 中间值 mid 在左部还是右部,然后再调整左右边界
  • 如果在左部例如:[3,4,5,6,7,1,2]
  • 如果在右部例如:[5,6,7,1,2,3,4]

二、代码

class Solution {
    public int search(int[] nums, int target) {
        if(target>nums[nums.length-1] && target < nums[0]){
            return -1;
        }
        int left = 0;
        int right = nums.length-1;
        while(left<=right){
            int mid = (left+right)/2;
            if(nums[mid]==target){
                return mid;
            }
            //中间值在左边
            if(nums[mid]>=nums[left]){
                //left 到 mid 是递增的
                if(target>=nums[left] && target<=nums[mid]){
                    right = mid-1;
                }else{
                    left = mid +1;
                }
            }else{
                //mid 到 right 是递增的
                if(target>=nums[mid] && target<=nums[right]){
                    left = mid +1;
                }else{
                    right = mid -1;
                }
            }
        }
        return -1;
    }
}

三、总结

本题中关键在于需要根据 中间值,分段考虑来确定左右的边界

同时注意等于号别忘加上,将等于号归于大于或小于中的情况

在这里插入图片描述