1. 程式人生 > 其它 >LeetCode560 和為K的子陣列

LeetCode560 和為K的子陣列

題目

給定一個整數陣列和一個整數 k,你需要找到該陣列中和為 k 的連續的子陣列的個數。

示例 1 : 
輸入:nums = [1,1,1], k = 2
輸出: 2 , [1,1] 與 [1,1] 為兩種不同的情況。

說明 : 
陣列的長度為 [1, 20,000]。 
陣列中元素的範圍是 [-1000, 1000] ,且整數 k 的範圍是 [-1e7, 1e7]。 

方法

列舉法

遍歷陣列,並計算從i開始的子陣列是否滿足條件

  • 時間複雜度:O(n2),n為nums陣列的長度
  • 空間複雜度:O(1)
class Solution {
    public int subarraySum(int[] nums, int k) {
        int n = nums.length;
        int result = 0;
        for(int i=0;i<n;i++){
            int sum = 0;
            for(int j=i;j<n;j++){
                sum += nums[j];
                if(sum==k){
                    result++;
                }
            }
        }
        return result;
    }
}

動態規劃法

遍歷陣列,用pre記錄當前位的相加之和,求某區間[i,j]的和即pre[j]-pre[i-1],

  • 時間複雜度:O(n)
  • 空間複雜度:O(n)
public class Solution {
    public int subarraySum(int[] nums, int k) {
        int result = 0,sum = 0;
        Map<Integer,Integer> map = new HashMap<>();
        map.put(0,1);
        for(int i=0;i<nums.length;i++){
            sum += nums[i];
            if(map.containsKey(sum-k)){
                result += map.get(sum-k);
            }
            map.put(sum,map.getOrDefault(sum,0)+1);
        }
        return result;
    }
}