Leetcode209 - 最小の長さのサブ配列

トピック

n 個の正の整数の配列と正の整数ターゲットが与えられます。

合計 ≥ target が配列を満たす最小の連続部分配列 [numsl, numsl+1, …, numsr-1, numsr] を見つけて、その長さを返します。一致するサブ配列が存在しない場合は 0 を返します。

例 1:

入力: target = 7、nums = [2,3,1,2,4,3]
出力: 2
説明: サブ配列 [4,3] は、この条件下で最小の長さのサブ配列です。
例 2:

入力: target = 4、nums = [1,4,4]
出力: 1
例 3:

入力: ターゲット = 11、数値 = [1,1,1,1,1,1,1,1]
出力: 0

ヒント:

1 <= ターゲット <= 109
1 <= nums.length <= 105
1 <= nums[i] <= 105

高度:

時間計算量が O(n) のソリューションを実装した場合は、時間計算量が O(n log(n)) のソリューションを設計してみてください。

答え

スライドウィンドウ

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        l = len(nums)
        left = 0
        right = 0

        res = float('inf')
        cur_sum = 0 #当前的累加值
        
        while right < l:
            cur_sum += nums[right]
            
            while cur_sum >= target: # 当前累加值大于目标值
                res = min(res, right - left + 1)
                # 减去最左边的数,然后左指针向右移动
                cur_sum -= nums[left]
                left += 1
            
            right += 1
        # 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
        return res if res != float('inf') else 0
'''
时间复杂度:O(N)
空间复杂度:O(1)
'''

分析する

時間をかけるのに O(n^2) だとは思わないでください。主に各要素の操作回数に依存します。各要素はスライディング ウィンドウの後ろに 1 回入って操作し、1 回出ます。各要素は操作されます。操作は 2 回実行されるため、時間計算量は 2 × n、つまり O(n) になります。

おすすめ

転載: blog.csdn.net/weixin_45013031/article/details/130994915