トピック
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) になります。