LeetCode081——搜索旋转排序数组II

版权声明:版权所有,转载请注明原网址链接。 https://blog.csdn.net/qq_41231926/article/details/82955777

我的LeetCode代码仓:https://github.com/617076674/LeetCode

原题链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii/description/

题目描述:

知识点:二分搜索法

思路:在二分搜索的基础上要额外判断nums[left]和nums[mid]值的大小关系

本题和LeetCode033——搜索旋转排序数组思路一致,但有一点差别,就是当nums[left]和nums[mid]相等时,我们的left和right索引该如何变化?

讨论如下两种情形:

(1)

上图中的绿色区域和蓝色区域的分界线代表的是旋转分界线。如果如上图所示中的情况有nums[left] == nums[mid],那么我们可以说middle ~ right位置的所有元素都和left相等。

(2)

而对于第二种情况,我们可以说left ~ middle位置的所有元素都和left相等。

我们就根据left ~ middle位置的所有元素是否均和left相等,来判断是(1)中的情形,还是(2)中的情形。

时间复杂度是O(nlogn),其中n为nums数组的长度。空间复杂度是O(1)。

JAVA代码:

public class Solution {

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

    private int[] search(int[] nums, int left, int mid, int right, int target){
        if(nums[mid] > nums[left]) {
            left = mid + 1;
        }else if(nums[mid] < nums[left]){
            right = mid - 1;
        }else{
            int i = left;
            for (; i <= mid; i++) {
                if(nums[i] != nums[mid]){
                    break;
                }
            }
            if(i <= mid){
                right = mid - 1;
            }else{
                left = mid + 1;
            }
        }
        int[] result = new int[2];
        result[0] = left;
        result[1] = right;
        return result;
    }
}

LeetCode解题报告:

猜你喜欢

转载自blog.csdn.net/qq_41231926/article/details/82955777
今日推荐