首页 > 其他分享 >力扣-81. 搜索旋转排序数组 II

力扣-81. 搜索旋转排序数组 II

时间:2024-07-14 10:41:21浏览次数:10  
标签:力扣 right target nums mid II 数组 81 left

1.题目

题目地址(81. 搜索旋转排序数组 II - 力扣(LeetCode))

https://leetcode.cn/problems/search-in-rotated-sorted-array-ii/

题目描述

已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。

在传递给函数之前,nums 在预先未知的某个下标 k0 <= 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

 

提示:

  • 1 <= nums.length <= 5000
  • -104 <= nums[i] <= 104
  • 题目数据保证 nums 在预先未知的某个下标上进行了旋转
  • -104 <= target <= 104

 

进阶:

  • 此题与 搜索旋转排序数组 相似,但本题中的 nums  可能包含 重复 元素。这会影响到程序的时间复杂度吗?会有怎样的影响,为什么?

 

2.题解

2.1 二分法

思路

对比33. 搜索旋转排序数组
这题需要考虑重复元素,尤其是nums[left] == nums[mid] == nums[right]时我们无法判断哪个时有序区间!!!
例如 nums=[3,1,2,3,3,3,3],target=2,首次二分时无法判断区间 [0,3] 和区间 [4,6] 哪个是有序的。

处理方法也很简单,我们由前面判断target != nums[mid] == nums[left] == nums[right]
所以排除两个位置left和right(将left++, right--)

代码

  • 语言支持:C++

C++ Code:


class Solution {
public:
    bool search(vector<int>& nums, int target) {
        int n = nums.size();
        int left = 0, right = n - 1;
        while(left <= right){
            int mid = (right - left) / 2 + left;
            if(target == nums[mid]) return true;
            // 此时已经确定target != nums[left] == nums[left] == nums[right],可直接排除两个边缘继续寻找
            if(nums[mid] == nums[left] && nums[mid] == nums[right]){
                left++; right--;
            }
            else if(nums[left] <= nums[mid]){
                if(target < nums[mid] && target >= nums[left]){
                    right = mid - 1;
                }else{
                    left = mid + 1;
                }
            }else{
                if(target <= nums[right] && target > nums[mid]){
                    left = mid + 1;
                }else{
                    right = mid - 1;
                }
            }
        }
        return false;
    }
};

复杂度分析

令 n 为数组长度。

  • 时间复杂度:\(O(n)\)
  • 空间复杂度:\(O(n)\)

标签:力扣,right,target,nums,mid,II,数组,81,left
From: https://www.cnblogs.com/trmbh12/p/18301156

相关文章

  • 力扣·33. 搜索旋转排序数组
    1.题目题目地址(33.搜索旋转排序数组-力扣(LeetCode))https://leetcode.cn/problems/search-in-rotated-sorted-array/题目描述整数数组nums按升序排列,数组中的值互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[n......
  • 使用SDRE对NPS II无人机进行点对点(调节)控制(Matlab代码实现)
     ......
  • 基于非支配排序遗传算法NSGAII的综合能源优化调度(Matlab代码实现)
    ......
  • 82. 删除排序链表中的重复元素 II
    82.删除排序链表中的重复元素II是一个有序链表错误代码classSolution{publicListNodedeleteDuplicates(ListNodehead){ListNodedummy=newListNode();dummy.next=head;while(head!=null&&head.next!=null){i......
  • 力扣-278. 第一个错误的版本
    1.题目题目地址(278.第一个错误的版本-力扣(LeetCode))https://leetcode.cn/problems/first-bad-version/题目描述你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所......
  • 代码随想录day 23 组合总和 | 组合总和II | 分割回文串
    组合总和组合总和解题思路利用回溯算法进行遍历,由于数组内的数字可以重复调用,因此在套用模板进行遍历时,下一次递归的startIndex是当前遍历的下标。剪枝操作则是通过比较和是否大于目标值,如果大于则不进行下一次的递归,以此来减少循环遍历的次数,这个条件需要加到for循环中。知......
  • 【华为OD】D卷真题100分:阿里巴巴找黄金宝箱(III) python代码实现[思路+代码]
    【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript-CSDN博客Java、JS、python、C、C++代码实现:【华为OD】D卷真题100分:阿里巴巴找黄金宝箱(III)Java代码实现[思路+代......
  • 代码随想录day22 组合 | 组合总和III | 电话号码的字母组合 |
    组合组合解题思路利用回溯算法来暴力枚举所有可能性。这里利用了代码随想录的解题模板即可。剪枝方面,由于某些情况下(如k=n)不需要遍历所有的可能性,因此我们要适当修改一下每次循环遍历的元素个数来进行优化知识点回溯心得如果知道如何将此类问题转换为一个n叉树,就会很......
  • 力扣 657. 机器人能否返回原点
    题目内容在二维平面上,有一个机器人从原点 (0,0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在 (0,0) 处结束。移动顺序由字符串 moves 表示。字符 move[i] 表示其第 i 次移动。机器人的有效动作有 R(右),L(左),U(上)和 D(下)。如果机器人在完成所有动作后返......
  • 力扣 682. 棒球比赛
    题目内容你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第 i 项操作,ops 遵循下述规则:整数 x -表示本......