アルゴリズム | スライディング ウィンドウ アルゴリズムのメモ

スライディングウィンドウ: 核となるアイデア

中心的なアイデア: ウィンドウ (サブ間隔とも呼ばれます) を維持し、ウィンドウの開始位置 ( start) と終了位置 ( ) を調整することによってend特定の条件を満たすサブ間隔を見つけます。

  • スライディング ウィンドウ アルゴリズムは、ダブル ポインターと組み合わせてよく使用されます。
  • 配列または文字列の部分範囲の問題を処理するためによく使用されます。
  • 利点は、線形時間計算量O ( N ) O(N)で実行できることです。ブルート フォース トラバーサルを使用せずに、 O ( N )内の部分区間を解く必要があるいくつかの問題を解決します

スライディング ウィンドウの問題を解決する手順:

  1. ウィンドウの左ポインタ(left)と右ポインタ(right) を初期化します。
    • 通常は配列または文字列の開始位置です。left, right = 0, 0
  2. ウィンドウの右ポインタ(right)を移動して、条件を満たすまでウィンドウを拡大します。
    • 一般に、右ポインタが配列または文字列の右境界に到達すると、ウィンドウの拡大を停止します。
  3. ウィンドウが条件を満たしている場合、最小または最大の長さを見つける必要がある場合は、結果を更新できます。
  4. ウィンドウの左ポインタ ( left) を移動して、条件が満たされなくなるまでウィンドウを縮小します。
  5. 配列または文字列全体が走査されるまで、手順 2 と 4 を繰り返します。

Leetcode: 最小長の部分配列

質問の説明

n正の整数の配列と正の整数を指定しますtarget

配列内で、合計が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:
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

質問リンク: https://leetcode.cn/leetbook/read/all-about-array/x9gogt/

問題の分析と実装

データ構造:配列

実装:

  • ブルートフォース方式

  • スライドウィンドウ

  • 前方和 + 二分探索

1	# Use Python to solve
2	def minSubArrayLen(target, nums):
3	    """
4	    使用滑动窗口算法解决:找到数组中和大于等于给定目标数的最短连续子数组的长度问题
5	
6	    参数:
7	        target(int):目标值
8	        nums(List[int]): 目标数组
9	
10	    返回值:
11	        int
12	    """
13	    n = len (nums)
14	    # 初始化左右指针
15	    left = 0
16	    right = 0
17	    # 初始化最小长度
18	    min_len = n + 1
19	
20	    cal_sum = 0
21	
22	    # 将 right 指针向右移动,并累计子数组的和 cal_sum。
23	    while right < n:
24	        cal_sum += nums[right]
25	        # 调整子数组的范围
26	        while cal_sum >= target:
27	            min_len = min (min_len, right - left + 1)
28	            cal_sum -= nums[left]
29	            left += 1
30	        right += 1
31	    # 如果最后最小长度没变,说明该数组当中不存在满足目标值的最小子区间,直接返回0
32	    if min_len == n + 1:
33	        return 0
34	    else:
35	        return min_len

最後に、オンライン デバッグ Web サイトをお勧めします。Web ページでは、プログラムの各ステップの呼び出し結果を直接表示でき、プログラムがどのように実行されるかを理解するのに役立ちます。

おすすめ

転載: blog.csdn.net/YuvalNoah/article/details/131610743