Leetcode 560 Subarry Sum Equals K
整数の配列と整数kを指定すると、合計がkに等しい連続サブアレイの総数を見つける必要があります。
例1:
入力:nums = [1,1,1]、k = 2
出力:2
注:
配列の長さは[1、20,000]の範囲です。
配列内の数値の範囲は[-1000、1000]であり、整数kの範囲は[-1e7、1e7]です。
スロティオン
approach1:ブルートフォース
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int n=nums.size();
int tmp;
int count=0;
for(int i=0;i<n;i++)
{
for(int j=i;j<n;j++)
{
tmp=0;
for(int k=i;k<=j;k++)
tmp+=nums[k];
if(tmp==k)
count++;
}
}
return count;
}
};
approach2:累積合計を使用する
sum [0、i]をアイテム0からi-1の合計として定義すると、アイテムiからjの合計はsum [i、j + 1] = sum [0、j + 1] -sumとして表すことができます。 [0、i]
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int n=nums.size();
int sum[n+1];
int tmp=0;
for(int i=0;i<n;i++)
{
sum[i]=tmp;
tmp+=nums[i];
}
sum[n]=tmp;
int count=0;
for(int i=0;i<n;i++)
for(int j=i+1;j<=n;j++)
if(sum[j]-sum[i]==k)
count++;
return count;
}
};
分析:
時間の複雑さ:O(N ^ 2)
空間の複雑さ:O(N)
approach3:O(1)空間を利用した累積和の利用
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int n=nums.size();
int tmp;
int count=0;
for(int i=0;i<n;i++)
{
tmp=0;
for(int j=i;j<n;j++)
{
tmp+=nums[j];
if(tmp==k)
count++;
}
}
return count;
}
};
分析:
時間の複雑さ:O(N ^ 2)
空間の複雑さ:O(1)
approach4:ハッシュマップを利用する
アプローチ2のアプローチを利用して、最初のパスでsum [0、i]が解決されるとき、前にjがあり、sum [0、j] = k-sum [0、i]である場合、sum [i、 j] = k?合計[i]をキーとして使用し、合計がハッシュマップまたはハッシュテーブルに格納されている合計[i]の出現回数を合計すると、合計[0、j]を通じて合計の出現回数を直接求めることができます。
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
dic={0:1}
tmp=0
count=0
for i in nums:
tmp+=i;
if tmp-k in dic:
count+=dic[tmp-k]
dic[tmp]=dic.get(tmp,0)+1
return count
分析:
時間の複雑度:O(N)
スペースの複雑度:O(N)