【LeetCode - Java】33. 搜索旋转排序数组(中等)

目录

    • 1. 题目描述
    • 2. 解题思路
    • 3. 代码实现

1. 题目描述

【LeetCode - Java】33. 搜索旋转排序数组(中等)_第1张图片

2. 解题思路

对于搜索类的题目最常用的是二分法,但该题目的重点在于如何判断下一个搜索区域是哪一部分,对于普通有序数组而言边界条件是很好判断的,但对于此类型经过旋转的局部有序数组则需要我们分情况讨论

  • 当前值就是目标值
    • 直接返回下标
  • 当前值比目标值小
    • 当前值及其左半部分是有序的右半部分最大值大于等于目标值
      • 搜索右边(如数组[4,5,6,7,0,1],目标值7;数组[4,5,1,2,3],目标值2)
    • 当前值及其左半部分是无序的(右半部分是有序的)且右半部分最大值小于目标值
      • 搜索左边(如数组[5,6,7,0,1,2,3],目标值7)
  • 当前值比目标值大
    • 当前值及其右半部分是有序的左半部分的最小值小于等于目标值
      • 搜索左边(如数组[6,7,0,1,2,3,4],目标值0;数组[3,5,1],目标值3)
    • 当前值及其右半部分是无序的(左半部分是有序的)且左半部分的最小值大于目标值
      • 搜索右边(如数组[4,5,6,7,0,1,2],目标值0)

3. 代码实现

public int search(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (nums[mid] == target)
                return mid;
            if (nums[mid] < target) {
                if (nums[mid] >= nums[left] || nums[right] >= target)
                    left = mid + 1;
                else
                    right = mid - 1;
            } else {
                if (nums[mid] <= nums[right] || nums[left] <= target)
                    right = mid - 1;
                else
                    left = mid + 1;
            }
        }
        return -1;
    }

该算法的时间复杂度为O(logn),空间复杂度为O(1)
【LeetCode - Java】33. 搜索旋转排序数组(中等)_第2张图片

你可能感兴趣的:(LeetCode,-,Java,java,leetcode,链表)