サブアレイの合計はC++でKに等しい
整数の配列と整数kがあるとすると、合計がkと同じ連続サブ配列の総数を見つける必要があります。したがって、nums配列が[1、1、1]で、kが2の場合、出力は2になります。
これを解決するには、次の手順に従います-
- sums、temp:=0、sums [0]:=1、ans:=0という1つのマップを定義します
- 0から配列のサイズまでの範囲のiの場合
- temp:=temp + n [i]
- 合計にk– tempがある場合、
- ans:=ans + sums [k --temp]
- sums[-temp]の値を1増やします
- 回答を返す
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int subarraySum(vector<int>& n, int k) {
unordered_map <int, int> sums;
int temp = 0;
sums[0] = 1;
int ans =0;
for(int i =0;i<n.size();i++){
temp+= n[i];
if(sums.find(k-temp)!=sums.end()){
ans += sums[k-temp];
}
sums[-temp]++;
}
return ans;
}
};
main(){
Solution ob;
vector<int> v = {1,1,1};
cout << (ob.subarraySum(v, 2));
} [1,1,1] 2
出力
2
-
C ++のプレフィックス合計を使用したO(n)の最大サブ配列合計
問題の説明 正の整数と負の整数の配列が与えられた場合、その配列の最大サブ配列の合計を求めます 例 入力配列が− {-12、-5、4、-1、-7、1、8、-3}の場合、出力は9 アルゴリズム 入力配列のプレフィックス合計を計算します。 Initialize− min_prefix_sum =0、res =-infinite i=0からnまでのループを維持します。 (nは入力配列のサイズです。) cand =prefix_sum [i] – mini キャンドの場合 がres(これまでのサブアレイの最大合計)より大きい場合は、resをcandで更新します。
-
C++で厳密に増加するサブアレイの最大合計を見つける
n個の整数の配列があるとします。厳密に増加するサブ配列の最大合計を求めます。したがって、配列が[1、2、3、2、5、1、7]のような場合、合計は8になります。この配列には、厳密に増加する3つのサブ配列があります。これらは{1、2、3}、{2 、5}および{1、7}。最大合計サブ配列は{1、7}です。 この問題を解決するには、最大合計と現在の合計を追跡する必要があります。各要素arr[i]について、これがarr [i – 1]より大きい場合は、これを現在の合計に加算します。それ以外の場合、arr[i]は別のサブアレイの開始点です。したがって、現在の合計を配列として更新します。現在の合計を更新す