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

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

时间:2022-11-10 23:33:17浏览次数:62  
标签:力扣 下标 target nums mid 旋转 II 数组 81

81. 搜索旋转排序数组 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

题解

力扣 33. 搜索旋转排序数组的变种,添加了可重复的元素,如果有极端情况2,2,2,2,2,2,2,2,2,2,1,2,2,切分区间时判断是否有序就会失效,所以在l,Mid,r下标上的元素相等时,需要缩小区间,两端各缩小一步,然后进行再进行下一轮mid的更新与判断。

查看代码
 class Solution {
public:
    bool search(vector<int>& nums, int target) {
        int r=nums.size()-1;
        int l=0;
        if(r==-1)
            return false;
        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&&nums[mid]>target)//t在区间[nums[l],num[mid])中,往左边
                    r=mid-1;
                else//去右边
                    l=mid+1;
            }
            else// if(nums[mid]<=nums[r])//右边有序
            {
                if(nums[mid]<target&&nums[r]>=target)//t在区间[nums[mid],num[r])中,往右边
                    l=mid+1;
                else
                    r=mid-1;
            }
        }
        return false;
    }
};

标签:力扣,下标,target,nums,mid,旋转,II,数组,81
From: https://www.cnblogs.com/fudanxi/p/16879219.html

相关文章

  • 818E - Card Game Again 双指针+分解质因数
    题意:有多少种xy的选择方法,使得对于长度为n的a数组,取 a[x+1],a[x+2]...a[y-2],a[y-1]的乘积是k的倍数 思路:对于所有的x,当选择x=x+1时y=y......
  • MIT6.S081笔记:Lab Xv6 And Unix Utilities
    关于MIT6.S081这门课的前身是MIT著名的课程6.828,MIT的几位教授为了这门课曾专门开发了一个基于x86的教学用操作系统JOS,被众多名校作为自己的操统课程实验。但随......
  • IIS7中asp.net执行cmd命令提示:拒绝访问。安全狗-》安全防护-》去掉勾选“进程行为控
    研究了一下午,怎么也没想到这里有个坑。。。安全狗-》安全防护-》去掉勾选“进程行为控制”     无法执行CMD的解决办法: ......
  • 力扣203 移除链表元素
    题目:给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例:输入:head=[1,2,6,3,4,5,6],val=6输......
  • 142.环形链表 II
    给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环......
  • 40. 组合总和 II
    思路为什么会出现重复?以{1,1,7}和target=8为例,如果不选0号位置的1,那么1号位置的1就也不应该选否则0号位置的1和7构成一个结果在不选0号位置时,1号位置的1和7又构成一个......
  • 问题 H: 超级跳跳跳1281
    这道题其实本身有点超纲,有点涉及动态规划的内容了,即求最大上升子序列的最大的和写不出来很正常,不用觉得自己菜哈哈哈哈哈,实在不彳亍跳过也是可以的,那我就直接放代码了......
  • 题解 LGP8819【[CSP-S 2022] 星战】
    postedon2022-10-3011:39:14|under题解|sourceproblem一个\(n\)个点\(m\)条边的有向图,\(q\)次操作:删除一条边,保证存在;增加一条边,保证不存在;删除一个点......
  • 题解 LGP8817【[CSP-S 2022] 假期计划】
    postedon2022-10-2923:32:15|under题解|sourceproblem\(n\)个点\(m\)条边的无向无权图,令\(to(i,j)=[\operatorname{dist}(i,j)\leqk+1]\),点带权\(a_i\),求:......
  • HDU 2216 Game III
    ProblemDescriptionZjtandSarawilltakepartinagame,namedGameIII.ZjtandSarawillbeinamaze,andZjtmustfindSara.Therearesomestrang......