LeetCode ---- 81、搜索旋转排序数组 II

题目链接

思路:

由于所给数组可能包含重复元素,那么就需要跳过重复元素,避免重复性搜索。

使用二分法进行搜索查找。

利用旋转数组的特性:从中间某个位置切分后,左边升序排列,右边升序排列,且数组第一个值大于等于数组最后一个值

利用二分法来确定搜索区间,之后在此区间内进行查找

    public boolean search(int[] nums, int target) {
        // 数组中不可能存在目标值的情况
        if (nums == null || nums.length == 0 || 
                            (target < nums[0] && target > nums[nums.length - 1])) {
            return false;
        }
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) {
            // 出现重复元素时,跳过
            while (left < right && nums[left] == nums[left + 1]) {
                left++;
            }
            while (left < right && nums[right] == nums[right - 1]) {
                right--;
            }
            int mid = (left + right) / 2;
            // 找到目标值,返回
            if (nums[mid] == target) {
                return true;
            }
            // 若此时的值大于等于左指针所指向的值,那么此时目标值只可能存在于左边区间内
            if (nums[mid] >= nums[left]) {
                // 目标值小于此时的值且大于等于左指针所指向的值时
                // 目标值可能存在于[left,mid - 1]中,此区间中进行二分查找
                if (target < nums[mid] && target >= nums[left]) {
                    right = mid - 1;
                } else {  // 目标值可能存在于[mid + 1, right]中
                    left = mid + 1;
                }
            } else {   // 目标值可能存在于右边区间内
                if (target > nums[mid] && target <= nums[right]) {
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            }
        }
        return false;
    }

猜你喜欢

转载自blog.csdn.net/sinat_34679453/article/details/107166806
今日推荐