LC33. 搜索旋转排序数组

/**
 * @Classname Solution
 * @Description 搜索旋转排序数组
 * @Date 2020/1/13 2:12
 * @Author SonnSei
 */
public class Solution {
    public static int search(int[] nums, int target) {
        if(nums == null || nums.length == 0)return -1;
        if(nums.length==1)return nums[0]==target?0:-1;
        int pos = findPos(nums);
        System.out.println(pos);
        if(target == nums[pos])return pos;
        if(pos==0)return Math.max(Arrays.binarySearch(nums, 0, nums.length, target),-1);
        if(target<nums[0]) return Math.max(Arrays.binarySearch(nums, pos , nums.length, target),-1);
        return Math.max(Arrays.binarySearch(nums, 0, pos, target),-1);
    }

    private static int findPos(int[] nums) {
        int left = 0;
        int right = nums.length-1;
        if(nums[left]<nums[right])return 0;
        while (left <= right) {
            int mid = (left+right)>>>1;
            if (nums[mid] > nums[mid + 1]) {
                // 为什么return mid不可以?其余的地方也改了逻辑
                // mid+1代表的是新数组的开始,如果数组没有旋转,0也是有正确意义的
                // mid代表的是数组的结束,如果数组没有旋转,就不应该返回0
                return mid+1;
            } else {
                if(nums[mid]<nums[left])
                    right=mid-1;
                else
                    left = mid+1;
            }
        }
        return 0;
    }
}

mid代表数组尾

/**
 * @Classname Solution2
 * @Description
 * @Date 2020/1/13 16:54
 * @Author SonnSei
 */
public class Solution2 {
    public static int search(int[] nums, int target) {
        if(nums == null || nums.length == 0)return -1;
        if(nums.length==1)return nums[0]==target?0:-1;
        int pos = findPos(nums);
        if(target == nums[pos])return pos;
        if(pos==nums.length-1)return Math.max(Arrays.binarySearch(nums, 0, nums.length, target),-1);
        if(target<nums[0]) return Math.max(Arrays.binarySearch(nums, pos+1 , nums.length, target),-1);
        return Math.max(Arrays.binarySearch(nums, 0, pos+1, target),-1);
    }

    private static int findPos(int[] nums) {
        int left = 0;
        int right = nums.length-1;
        if(nums[left]<nums[right])return right;
        while (left <= right) {
            int mid = (left+right)>>>1;
            if (nums[mid] > nums[mid + 1]) {
                return mid;
            } else {
                if(nums[mid]<nums[left])
                    right=mid-1;
                else
                    left = mid+1;
            }
        }
        return 0;
    }
}
发布了140 篇原创文章 · 获赞 2 · 访问量 1885

猜你喜欢

转载自blog.csdn.net/weixin_40602200/article/details/103960850