数据结构与算法之深入解析“搜索旋转排序数组II”的求解思路与算法示例

Posted Serendipity·y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法之深入解析“搜索旋转排序数组II”的求解思路与算法示例相关的知识,希望对你有一定的参考价值。

一、题目要求

  • 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。
  • 在传递给函数之前,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] 。
  • 给你旋转后的数组 nums 和一个整数 target ,请你编写一个函数来判断给定的目标值是否存在于数组中。如果 nums 中存在这个目标值 target ,则返回 true ,否则返回 false 。
  • 必须尽可能减少整个操作步骤。
  • 示例 1:
输入:nums = [2,5,6,0,0,1,2], target = 0
输出:true
  • 示例 2:
输入:nums = [2,5,6,0,0,1,2], target = 3
输出:false

二、求解算法

① 二分查找

  • 对于数组中有重复元素的情况,二分查找时可能会有 a[l]=a[mid]=a[r],此时无法判断区间 [l,mid] 和区间 [mid+1,r] 哪个是有序的。
  • 例如 nums=[3,1,2,3,3,3,3],target=2,首次二分时无法判断区间 [0,3] 和区间 [4,6] 哪个是有序的。对于这种情况,只能将当前二分区间的左边界加一,右边界减一,然后在新区间上继续二分查找。
  • Java 示例:
class Solution 
    public boolean search(int[] nums, int target) 
        int n = nums.length;
        if (n == 0) 
            return false;
        
        if (n == 1) 
            return nums[0] == target;
        
        int l = 0, r = n - 1;
        while (l <= r) 
            int mid = (l + r) / 2;
            if (nums[mid] == target) 
                return true;
            
            if (nums[l] == nums[mid] && nums[mid] == nums[r]) 
                ++l;
                --r;
             else if (nums[l] <= nums[mid]) 
                if (nums[l] <= target && target < nums[mid]) 
                    r = mid - 1;
                 else 
                    l = mid + 1;
                
             else 
                if (nums[mid] < target && target <= nums[n - 1]) 
                    l = mid + 1;
                 else 
                    r = mid - 1;
                
            
        
        return false;
    

  • C++ 示例:
class Solution 
public:
    bool search(vector<int> &nums, int target) 
        int n = nums.size();
        if (n == 0) 
            return false;
        
        if (n == 1) 
            return nums[0] == target;
        
        int l = 0, r = n - 1;
        while (l <= r) 
            int mid = (l + r) / 2;
            if (nums[mid] == target) 
                return true;
            
            if (nums[l] == nums[mid] && nums[mid] == nums[r]) 
                ++l;
                --r;
             else if (nums[l] <= nums[mid]) 
                if (nums[l] <= target && target < nums[mid]) 
                    r = mid - 1;
                 else 
                    l = mid + 1;
                
             else 
                if (nums[mid] < target && target <= nums[n - 1]) 
                    l = mid + 1;
                 else 
                    r = mid - 1;
                
            
        
        return false;
    
;
  • 未完待续。。。

以上是关于数据结构与算法之深入解析“搜索旋转排序数组II”的求解思路与算法示例的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

leetcode 81. Search in Rotated Sorted Array II 搜索旋转排序数组 II(中等)

LeetCode81. 搜索旋转排序数组 II