Leetcode 560 Subarry Sum Equals K

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)

参照リンク

リートコード

おすすめ

転載: www.cnblogs.com/qwfand/p/12754899.html