Leikou質問メモ:1438。絶対差が制限を超えない最長の連続サブ配列(スライドウィンドウテンプレートの質問、順序付きリストを選択SortedList()データ型はタイムアウトしません)

トピック:

1438.絶対差が制限を超えない最長の連続サブアレイ

整数配列numsと制限を表す整数制限を指定して、最長の連続サブ配列の長さを返します。サブ配列内の任意の2つの要素間の絶対差は、制限以下である必要があります。

条件を満たすサブ配列がない場合は、0が返されます。

例1:

入力:nums = [8,2,4,7]、limit = 4
出力:2
説明:すべてのサブ配列は次のとおりです。
[8]最大絶対差| 8-8 | = 0 <= 4.
[8、 2]最大絶対差| 8-2 | = 6> 4.
[8,2,4]最大絶対差| 8-2 | = 6> 4.
[8,2,4,7]最大絶対差| 8- 2 | = 6> 4.
[2]最大絶対差| 2-2 | = 0 <= 4.
[2,4]最大絶対差| 2-4 | = 2 <= 4.
[2,4,7]最大絶対差| 2-7 | = 5> 4.
[4]最大絶対差| 4-4 | = 0 <= 4。
[4,7]最大絶対差| 4-7 | = 3 <= 4.
[ 7]最大絶対差| 7-7 | = 0 <= 4.
したがって、質問の意味を満たす最長のサブ配列の長さは2です。

例2:

入力:nums = [10,1,2,4,7,2]、limit = 5
出力:4
説明:質問の意味を満たす最長のサブ配列は[2,4,7,2]であり、その最大絶対差| 2-7 | = 5 <= 5。

例3:

入力:nums = [4,2,2,2,4,4,2,2]、limit = 0
出力:3

促す:

1 <= nums.length <= 10 ^ 5
1 <= nums [i] <= 10 ^ 9
0 <=制限<= 10 ^ 9

問題解決のアイデア:

通常のリストを使用して再度ソートすると、lognの時間計算量が増加し、タイムアウトになります。

順序付きリストのデータ型を選択した後、スライディングウィンドウテンプレートを直接設定できます。これは簡単です。

Pythonスライディングウィンドウテンプレート:https//blog.csdn.net/weixin_44414948/article/details/113862173

問題解決のPythonコード:

class Solution:
    def longestSubarray(self, nums: List[int], limit: int) -> int:
        from sortedcontainers import SortedList
        s = SortedList()  # 使用有序列表数据类型
        n = len(nums)
        left = right = 0
        ans = 0
        while right<n:
            s.add(nums[right])  # 注意有序列表类型没有append,只有add
            while s[-1]-s[0]>limit:  # 右指针移动至不满足limit时,开始移动左指针至满足条件
                s.remove(nums[left])
                left += 1  # 左指针移动
            ans = max(ans, right-left+1)  # 更新最大长度
            right += 1
        return ans

著者:a-qing-ge
リンク:https//leetcode-cn.com/problems/longest-continuous-subarray-with-absolute-diff-less-than-or-equal-to-limit/solution/hua-chuang -mo-ban-ti-xuan-ze-you-xu-lie-286dv /
出典:LeetCode https://leetcode-cn.com/problems/longest-continuous-subarray-with-absolute-diff- less- than-または-equal-to-limit /

おすすめ

転載: blog.csdn.net/weixin_44414948/article/details/113916473