合計が与えられた値に等しいサブアレイを見つけるための累積合計

Umer Farooq

次のコードの背後にあるロジックを理解しようとしていますが、ロジックをサポートする数学が現時点では完全に明確ではないため、コードの2つの部分について部分的に不明です。

  1. 混乱1:配列の合計を見つける前に、なぜカウント= 1で0をマップに入れるのかわかりませんか?それはどのように役立ちますか?

  2. 混乱2:map.put(sum, map.getOrDefault(sum)+1) if()条件の後に移動すると、正しい解が得られます。ただし、以下のコードのような場所に置くと、間違った結果になります。問題は、カウントを見つけるためにマップでsum-kの値を検索するときに、なぜこれの位置が重要なのかということです。

    public int subarraySum(int[] nums, int k) {
    
         HashMap<Integer,Integer> prefixSumMap = new HashMap<>();
         prefixSumMap.put(0, 1); // CONFUSION 1
    
         int sum = 0;
         int count = 0;
    
         for(int i=0; i<nums.length; i++) {
             sum += nums[i];
    
             prefixSumMap.put(sum, prefixSumMap.getOrDefault(sum, 0)+1); //CONFUSION 2
             if(prefixSumMap.containsKey(sum - k)) {
                 count += prefixSumMap.get(sum - k);
             }
         }
    
         return count;
     }
    
WJS

これは面白いと思うかもしれません。整数オーバーフローが負の数になるのを防ぐために、longを使用するようにメソッドを変更しました。

これらの方法はどちらも、正の数に対しては問題なく機能します。最初のものははるかに単純ですが、どちらもテスト配列に対して同じカウントを返します。

public static void main(String[] args) {
Random r = new Random();
long[] vals = r.longs(10_000_000, 1, 1000).toArray();
long k = 29329;
System.out.println(positiveValues(vals, k));
System.out.println(anyValues(vals, k));


public static int positiveValues(long[] array, long k) {
    
    Map<Long,Long> map = new HashMap<>(Map.of(0L,1L));
    int count = 0;
    long sum = 0;
    
    for (long v : array) {
      sum += v;
      map.put(sum,1L);
       if (map.containsKey(sum-k)) {
           count++;
       }
    }
    return count;
}

public static int anyValues(long[] nums, long k) {

     HashMap<Long,Long> prefixSumMap = new HashMap<>();
     prefixSumMap.put(0L, 1L); 

     long sum = 0;
     int count = 0;

     for(int i=0; i<nums.length; i++) {
         sum += nums[i];
         prefixSumMap.put(sum, prefixSumMap.getOrDefault(sum, 0L)+1L);
         if(prefixSumMap.containsKey(sum - k)) {
             count += prefixSumMap.get(sum - k);
         }
     }
     return count;
 }

さらに、ステートメント

    long v = prefixSumMap.getOrDefault(sum,  0L) + 1L;

正の配列の場合は常に1を返します。これは、前の合計が正の値のみに対して再遭遇することは決してないためです。

そのステートメント、およびcountマップから値を取得して計算するステートメントは、配列に正の数と負の数の両方を含めることができるようにすることです。そして、これは真実であり-k、すべての正の値です。

次の入力の場合:

long[] vals = {1,2,3,-3,0,3};

合計が3になるサブ配列は次のとおりです。

(1+2), (3), (1+2+3-3), (1+2+3-3+0), (3-3+0+3), (0+3), (3)

負の数を追加すると前の合計になる可能性があるため、それらを考慮する必要があります。正の値のソリューションはこれを行いません。

これは、すべての負の値に対しても機能します。kが正の場合no、すべての合計が負になるためサブ配列が見つかります。kが負の場合、1つ以上のサブ配列mayが見つかる可能性があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

与えられた合計でサブアレイを見つける

分類Dev

与えられた値に等しい対応する要素の数の最小の合計を見つける方法は?

分類Dev

整数の配列と合計が与えられた場合、タスクは、合計が指定された合計と等しい、指定された配列のサブセットが存在するかどうかを見つけることです

分類Dev

合計が指定された値に等しい2つのリストからペアを見つけます

分類Dev

与えられた値に合計される最小の素数を見つけます

分類Dev

与えられた合計で最も広いサブ配列を見つける(配列スライシング)

分類Dev

与えられた数に最も近い数の合計を見つける

分類Dev

整数の配列が与えられた場合、Javaで合計配列の合計が最も低い重複値を見つけて増分しますか?

分類Dev

最大長が与えられたピトゴリアントリプレットの合計を見つける

分類Dev

累計を見つけるために使用される2つの値の差

分類Dev

合計が最大の重複しないサブアレイのペアを見つける

分類Dev

合計が与えられたKよりも小さいサブリストの量を見つけるためのアルゴリズムはありますか?O(N ^ 2)よりも優れている

分類Dev

累積合計が大きくなる配列内のインデックスを見つけるための高速で厄介な方法はありますか?

分類Dev

正の整数値を持つサイズMxNの2D行列が与えられた場合、最大の合計を持つ閉ループを見つけます

分類Dev

R:しきい値を超える差がある場合の累積合計

分類Dev

サブアレイの合計を見つける

分類Dev

mongoDbの配列要素の累積合計を見つけるのに役立つクエリまたは演算子

分類Dev

合計がo(n)の複素数で指定された値に等しいペアを見つけます

分類Dev

合計が指定された数に等しい配列から要素のペアを見つけます

分類Dev

同じサイズの2つの配列が与えられた場合、最小の絶対値で合計をとる両方の配列からいくつかの要素を見つけます

分類Dev

合計が指定された数で割り切れる最長の連続サブアレイの長さを見つける方法

分類Dev

アルゴリズムがスタックを使用して正確な合計を持つサブセットを見つけられない場合、ターゲットに最も近い値を持つサブセットを見つける

分類Dev

R-年ごとの累積合計を使用し、条件が満たされたときに累積合計を再開する方法

分類Dev

与えられた数として合計を作るリストで数のペアを見つける方法

分類Dev

numpy軸全体の最終的な累積合計を見つけるにはどうすればよいですか?

分類Dev

ソートされていない2つの配列AとBが与えられた場合、配列の1つだけをソートすることにより、合計(または差)が与えられたkに等しい要素のペアを見つけます。

分類Dev

与えられた合計を得るためにシーケンス要素でxorする数を見つける

分類Dev

n個の正の整数のシーケンスが与えられた場合、差の絶対値の合計が最大になるような長さkのサブシーケンスを見つけます。

分類Dev

配列が与えられた場合、可能な最大の2つの等しい合計を見つける必要があります

Related 関連記事

  1. 1

    与えられた合計でサブアレイを見つける

  2. 2

    与えられた値に等しい対応する要素の数の最小の合計を見つける方法は?

  3. 3

    整数の配列と合計が与えられた場合、タスクは、合計が指定された合計と等しい、指定された配列のサブセットが存在するかどうかを見つけることです

  4. 4

    合計が指定された値に等しい2つのリストからペアを見つけます

  5. 5

    与えられた値に合計される最小の素数を見つけます

  6. 6

    与えられた合計で最も広いサブ配列を見つける(配列スライシング)

  7. 7

    与えられた数に最も近い数の合計を見つける

  8. 8

    整数の配列が与えられた場合、Javaで合計配列の合計が最も低い重複値を見つけて増分しますか?

  9. 9

    最大長が与えられたピトゴリアントリプレットの合計を見つける

  10. 10

    累計を見つけるために使用される2つの値の差

  11. 11

    合計が最大の重複しないサブアレイのペアを見つける

  12. 12

    合計が与えられたKよりも小さいサブリストの量を見つけるためのアルゴリズムはありますか?O(N ^ 2)よりも優れている

  13. 13

    累積合計が大きくなる配列内のインデックスを見つけるための高速で厄介な方法はありますか?

  14. 14

    正の整数値を持つサイズMxNの2D行列が与えられた場合、最大の合計を持つ閉ループを見つけます

  15. 15

    R:しきい値を超える差がある場合の累積合計

  16. 16

    サブアレイの合計を見つける

  17. 17

    mongoDbの配列要素の累積合計を見つけるのに役立つクエリまたは演算子

  18. 18

    合計がo(n)の複素数で指定された値に等しいペアを見つけます

  19. 19

    合計が指定された数に等しい配列から要素のペアを見つけます

  20. 20

    同じサイズの2つの配列が与えられた場合、最小の絶対値で合計をとる両方の配列からいくつかの要素を見つけます

  21. 21

    合計が指定された数で割り切れる最長の連続サブアレイの長さを見つける方法

  22. 22

    アルゴリズムがスタックを使用して正確な合計を持つサブセットを見つけられない場合、ターゲットに最も近い値を持つサブセットを見つける

  23. 23

    R-年ごとの累積合計を使用し、条件が満たされたときに累積合計を再開する方法

  24. 24

    与えられた数として合計を作るリストで数のペアを見つける方法

  25. 25

    numpy軸全体の最終的な累積合計を見つけるにはどうすればよいですか?

  26. 26

    ソートされていない2つの配列AとBが与えられた場合、配列の1つだけをソートすることにより、合計(または差)が与えられたkに等しい要素のペアを見つけます。

  27. 27

    与えられた合計を得るためにシーケンス要素でxorする数を見つける

  28. 28

    n個の正の整数のシーケンスが与えられた場合、差の絶対値の合計が最大になるような長さkのサブシーケンスを見つけます。

  29. 29

    配列が与えられた場合、可能な最大の2つの等しい合計を見つける必要があります

ホットタグ

アーカイブ