整数の配列と整数kを考えると、あなたは合計kに等しい連続サブアレイの総数を見つける必要があります。
例1:
入力:NUMS = [1,1,1]、K = 2 出力:2
注意:
- 配列の長さは、[20,000 1]の範囲内です。
- アレイ内の数字の範囲は[-1000 1000]であり、整数kの範囲は[-1e7、1E7]です。
ソリューション1.プレフィックス和、O(N ^ 2)実行時、O(N)スペース
1.入力配列のプレフィックス合計を計算します。
各サブアレイ間隔2.、そのチェックサムは、kはそうであれば、結果、カウンタに1を加算することに等しいです。このステップは、O(N ^ 2)の時間を要します。
クラスソリューション{ 公共 のint subarraySum(INT [] NUMS、int型K){ int型のn = nums.length。 INT [] prefixSum = 新しい INT [N + 1 ]。 以下のために(int型 I ++はi = 1; iが<= N ){ prefixSum [I] = prefixSum [I - 1] + NUMS [I - 1 ]。 } int型のカウント= 0 ; 以下のために(int型 ; iがn <I ++は、I = 0 {) のために(int型 J <= N; J = I + 1、J ++){ 場合(prefixSum [J] - prefixSum [I] == k)をカウント++ 。 } } リターン回数、 } }
HashMapの、O(N)実行時と空間を持つソリューション2.プレフィックス合計
1.実行中のプレフィックス和とそれぞれ異なるプレフィックス合計値の数を格納ハッシュマップを保管してください。空の間隔の0の和を表し、(0、1)ハッシュマップに追加します。
与えられたプレフィックス和PS 2. PSに等しいプレフィックス合計がある場合、チェック - kは。PSのいずれかのような接頭和 - kは和kの間隔があることを意味します。それぞれのそのようなプレフィックス和のために、最終カウンタに1を追加します。
3.後でチェックのハッシュマップに現在の接頭辞合計を追加します。
このソリューションは簡単に合計がkにすべての間隔を取得するように変更することができます。ただ、現在の要素のインデックスを持つようにハッシュマップの値を増大させます。
クラスソリューション{ 公共 のint subarraySum(INT [] NUMS、int型K){ 地図 <整数、整数>マップ= 新しい HashMapの<> (); int型 prefixSum = 0、= 0を数えます。 map.put( 0、1 )。 以下のために(int型 ; iはnums.length <I ++は、I = 0 ){ prefixSum + = NUMS [I]を、 カウント + = map.getOrDefault(prefixSum - K、0 ); map.put(prefixSum、map.getOrDefault(prefixSum、 0)+ 1 )。 } 戻り値の数。 } }