581. 最短无序连续子数组

本文介绍了两种高效解决LeetCode问题'最短无序连续子数组'的方法:一种是通过全局排序找出不同元素的位置,另一种是利用数组两端有序性快速定位临界点。通过实例演示了如何使用这两种方法找到数组中的无序子数组长度。
摘要由CSDN通过智能技术生成

581. 最短无序连续子数组 - 力扣(Leetcode)https://leetcode.cn/problems/shortest-unsorted-continuous-subarray/description/第一种方法就是对整个数组进行排序,那么左边第一个开始不一样的,与右边第一个开始不一样的,这两者之间的距离就是连续的无序数组

class Solution:
    def findUnsortedSubarray(self, nums):
        lst=list(nums)
        lst.sort()
        i,j=0,len(lst)-1
        while i<len(lst):
            if lst[i]!=nums[i]:
                break
            i+=1
        if i==len(lst):
            return 0
        while j>0:
            if lst[j]!=nums[j]:
                break
            j-=1
        return j-i+1

第二种方法如下

如果右边已经排好序了,肯定比左边的最大值还要大,所以这个数如果比左边最大值小,那么,这个数肯定不在右边已经排好序的数组中;

如果左边已经排好序了,肯定比右边最小值还小,如果它比右边最小值大,那么这个数肯定不在左边的已经排好序的数组中

这样就找到了两个有序数组的临界

class Solution:
    def findUnsortedSubarray(self, nums):
        le = len(nums)
        maxx, minn = nums[0], nums[le - 1]
        i, j = 0, le - 1
        l,r=0,-1
        while i < le:
            if nums[i] < maxx:
                r=i
            maxx = nums[i]  # 左边是升序嘛
            i += 1
        while j >= 0:
            if nums[j] > minn:
                l=j
            minn = nums[j]  # 左边是升序嘛
            j -= 1
        return r - l + 1
a=Solution()
print(a.findUnsortedSubarray([2,6,4,8,10,9,15]))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值