首页 > 其他分享 >581. 最短无序连续子数组

581. 最短无序连续子数组

时间:2023-03-24 20:12:11浏览次数:32  
标签:遍历 nums int curmax 581 无序 最短 while 数组

题目描述

从数组中找一个连续子数字,对子数组升序的时候,数组就是升序的。
求最短的子数组的长度?

f1排序+双指针

基本分析

  1. 如果排序后怎么找?左边第一个不等的点和右边第一个不等的点

代码

class Solution:
    def findUnsortedSubarray(self, nums: List[int]) -> int:
        nums_sorted = sorted(nums)

        n = len(nums)
        l, r = 0, n-1

        while l <= r and nums[l] == nums_sorted[l]:
            l += 1

        while r >= l and nums[r] == nums_sorted[r]:
            r -= 1
        
        return r - l + 1

总结

  1. 这里为啥用 <=, 不是 < ? 待明确
f2-双指针一次遍历

基本分析

  1. k遍历的区间?l,r
  2. 指针移动的方向?i从l到0,j从r到n-1
  3. 每次枚举k,什么时候需要更新i或者j?j位置的值比左边的最小小或者比右边的最大大
  4. 如果需要维护,怎么维护?一直往左或者往右找,找到第一个<=nums[k]的值,或者第一个>=nums[k]的值
  5. 越界的情况怎么处理?i到头给-inf,j到头给inf,这样判断的时候都会满足
  6. 结果怎么计算?区分相等或者不等的情况

代码

class Solution:
    def findUnsortedSubarray(self, nums: List[int]) -> int:

        n = len(nums)
        i, j = 0, n-1
        while i < j and nums[i] <= nums[i+1]:
            i += 1
        while i < j and nums[j] >= nums[j-1]:
            j -= 1
        
        # 这里找到的i和j都是满足单调条件的
        l, r = i, j
        # 最开始是1增结尾,3增开始
        curmin, curmax = nums[i], nums[j]
        
        # 为什么l是满足条件的,为啥要从l遍历?可能nums[l] > max
        for k in range(l, r+1):
            # 如果当前值比左边的小值小,小值的位置不保
            if nums[k] < curmin:
                while i >= 0 and nums[i] > nums[k]:
                    i -= 1
                # 出来以后i可能是0,可能是找到了满足nums[i] <= nums[k]的索引
                if i < 0:
                    # 足够小了,不用再比了
                    curmin = -inf
                else:
                    # 否则更新当前小值
                    curmin = nums[i]
            if nums[k] > curmax:
                while j <= n-1 and nums[j] < nums[k]:
                    j += 1
                # 找到的合适的点可能是结尾,可能是真的有
                if j > n-1:
                    # 别找了
                    curmax = inf
                else:
                    curmax = nums[j]
        
        # 遍历完以后,可能ij就是一个点,也可能不是
        if i == j:
            return 0
        else:
            return (j-1) - (i+1) + 1

总结

  1. 可能可以用单调栈处理,需要考虑下

标签:遍历,nums,int,curmax,581,无序,最短,while,数组
From: https://www.cnblogs.com/zk-icewall/p/17253201.html

相关文章

  • 使用SQL语句实现最短路线问题
    今天学习了一种直接用sql语句实现查询最短路径的方法,为我们的系统开发提供了便利。Stringsql="WITHRECURSIVEtransfer(start_station,stop_station,stops,path)......
  • 「最短路径树」黑暗城堡
    本题为3月17日23上半学期集训每日一题中B题的题解题面题目描述在顺利攻破Lordlsp的防线之后,lqr一行人来到了Lordlsp的城堡下方。Lordlsp黑化之后虽然拥有了......
  • 多源最短路Floyd本质理解
    \(Floyd\)总结复习Floyd是动态规划的典型体现,其思想从集合角度用闫氏DP分析法即可其关键的性质理解:即外层循环k的理解。\(dist[k][i][j]\)代表(k的取值范围是从1到n),在考......
  • 简单图最短路径
    graph={'保安':['巡检','巡逻','监控'],'监控':['监视','密切','白领'],'巡逻':['白领','蓝领','科学家'],'白领':['销售','大堂经理',&#......
  • # 909 -「java」一维数组展开+ BFS解决 -蛇梯棋- 最短步进次数 的详细思路
    Tags:中等数组BFSjava 题目链接:909.蛇梯棋 注意事项[题目中的坑]:【"S形"的概念】:题目开头举例的N*N的数组,其内标示的1~N²数字,指代的是......
  • 多源最短路算法——Floyd算法(转载)
    1.多源最短路简介:我们知道单源最短路是指从某一个源点到图中的其它顶点的最短路。多源最短路就是指每一个点到图中其他顶点的最短路。那么有的人肯定想我知道求单源最短路......
  • 最短路
    #include<bits/stdc++.h>usingnamespacestd;intg[205][205];intmain(){memset(g,0x3f,sizeofg);intn,m,k;cin>>n>>m>>k;while(m--){in......
  • 最短路计数
    /*边权值都为1,所以可以用BFS来做记住BFS和dikstra都是满足拓扑序性质的,也就是说可以用二者解决图论中的dp问题,而spfa不满足拓扑序的性质*/#include<bits/st......
  • AcWing 第 94 场周赛 A B(最短路dij) C(最短路floyed)
    https://www.acwing.com/activity/content/competition/problem_list/2961/AcWing4870.装物品水题#include<bits/stdc++.h>usingnamespacestd;typedeflonglon......
  • 最短路之和
    最短路之和给定一个$n$个点的加权有向图,点的编号为$1\simn$。图中任意两点之间都有两条方向相反的边连接两点。从点$i$到点$j$的边的长度为$a_{ij}$。给定一......