LeetCode81. 搜索旋转排序数组 II

Posted mx_info

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode81. 搜索旋转排序数组 II相关的知识,希望对你有一定的参考价值。

LeetCode81. 搜索旋转排序数组 II

题目说明

/**
     * 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。
     * <p>
     * 在传递给函数之前,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,4,4,5,6,6,7]
     * 在下标 5 处经旋转后可能变为 [4,5,6,6,7,0,1,2,4,4] 。
     * <p>
     * 给你 旋转后 的数组 nums 和一个整数 target ,
     * 请你编写一个函数来判断给定的目标值是否存在于数组中。
     * 如果 nums 中存在这个目标值 target ,则返回 true ,否则返回 false 。
     */

思路分析

  1. 已知原数组是顺序排列的,但是要将其在第k个位置进行旋转,形成新数组,然后在新数组中查找目标值
  2. 因为数组中可能有重复元素,因此在第k个位置旋转后,可能出现最左侧元素和中间值相等或者最右侧元素和中间值相等的情况。因此要进行左侧索引+1或者右侧索引-1的操作
  3. 因为原始数组是有序的,因此在第k个位置旋转后得到的新数组仍然能够保证有一半元素是顺序的,因此需要先判断那一半是有序的,然后在这一半进行查找
  4. 不断的判断 然后重置数组下标,直到查找到或者查找完所有的元素为止
  5. 源码见下

源码及分析

/**
     * @param nums   旋转后的数组
     * @param target 要查找的值
     * @return 返回是否查找到
     */
    public boolean search(int[] nums, int target) {
        //定义左右指针和中间指针
        int left = 0, right = nums.length - 1, mid;
        //二分查找
        while (left <= right) {
            mid = (right + left) / 2;
            //判断中间值是否就是目标值
            if (nums[mid] == target) {
                return true;
            }
            //判断中间值和左侧值是否相等
            if (nums[mid] == nums[left]) {
                left++;
                continue;
            }
            //判断中间值和右侧值是否相等
            if (nums[mid] == nums[right]) {
                right--;
                continue;
            }
            //判断是前半部分有序还是后半部分有序
            //如果前半部分有序
            if (nums[left] < nums[mid]) {
                //判断目标值是否在前半部分所在区间,并重置左右指针
                if (nums[left] <= target && target < nums[mid]) {
                    right = mid - 1;
                } else {
                    left = mid + 1;
                }
                //否则如果后半部分有序
            } else {
                //判断目标值是否在后半部分所在区间,并重置左右指针
                if (nums[mid] < target && target <= nums[right]) {
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            }
        }
        return false;
    }

以上是关于LeetCode81. 搜索旋转排序数组 II的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 81.搜索旋转排序数组 II

LeetCode 81——搜索旋转排序数组 II

LeetCode 81. 搜索旋转排序数组 II

Python描述 LeetCode 81. 搜索旋转排序数组 II

Python描述 LeetCode 81. 搜索旋转排序数组 II

Python描述 LeetCode 81. 搜索旋转排序数组 II