ツーポインタとスライディング ウィンドウのパターン
パターン 1: 定数ウィンドウ (ウィンドウ = 4 または何らかの整数値など)
たとえば、(-ve および ve) の整数の配列が与えられた場合、サイズ k.
の連続ウィンドウの最大合計を見つけます。パターン 2:(可変ウィンドウ サイズ) を持つ最大の部分配列/部分文字列 例: sum
パターン 3: が sum=k のような部分配列/部分文字列の番号。
これは、いつ拡大するか (右)、いつ縮小するか (左) が難しくなるため、解決するのが非常に困難です。
この問題は パターン 2
を使用して解決できます
sum =k.
これは次のように分解できます
パターン 4: 最短/最小ウィンドウを見つける
パターン 2 のさまざまなアプローチ:
例: sum
public class Sample{ public static void main(String args[]){ n = 10; int arr[] = new int[n]; //Brute force approach for finding the longest subarray with sum k) break; /// optimization if the sum is greater than the k, what is the point in going forward? } }
2 つのポインターとスライディング ウィンドウを使用したより良いアプローチ
//O(n n) in the worst case r will move from 0 to n and in the worst case left will move from 0 0 n as well so 2n int left = 0; int right =0; int sum = 0; int maxLen = 0; while(rightk){ sum = sum-arr[left]; left ; } if(sum 最適なアプローチ:
部分配列が見つかったらその長さを maxLen に保存することはわかっていますが、 arr[right] を追加するときに合計が k を超えた場合、現在は sum = sum-arr[left] を実行して left を実行することで左に縮小しています。
現在の Max 長さが maxLen であることがわかっています。左側のインデックスを縮小し続けると、条件 ( maxLen である別の部分配列を見つけると、maxLen のみが更新されます。最適なアプローチは、サブ配列が条件 (
int right =0; int sum = 0; int maxLen = 0; while(rightk){// this will ensure that the left is incremented one by one (not till the sum
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3