Passion and Patience

Work Hard, Play Hard

导航

Leetcode 和为k的子数组

Day11 第一题

#######解题思路:两层循环,用暴力法解决(从不同起始位置开始的子数组)

class Solution {
    public int subarraySum(int[] nums, int k) {
        // 和为k的子数组的个数计数器count
        int count = 0; 
        for(int j =0;j<nums.length;j++){
            int sum = 0;
            for(int i = j;i < nums.length;i++){
                sum = sum + nums[i];
                if(sum == k){
                    count++;
                }
            }
        }
        
        return count;    
    }
}
力扣官方解答:
public class Solution {
    public int subarraySum(int[] nums, int k) {
        int count = 0, pre = 0;
        HashMap < Integer, Integer > mp = new HashMap < > ();
        
        mp.put(0, 1);
        for (int i = 0; i < nums.length; i++) {
            pre += nums[i];
            if (mp.containsKey(pre - k)) {
                count += mp.get(pre - k);
            }
            mp.put(pre, mp.getOrDefault(pre, 0) + 1);
        }
        return count;
    }
}

####### 巧妙的利用\(sum[i,j] = sum[0,j]- sum[0,i-1]\),所以有sum[i-1] = sum[j] - k,所以\(i-1<j\),即contains判断要在hashmap加上sum[j]之前。

posted on 2024-03-26 21:49  安静的聆  阅读(5)  评论(0编辑  收藏  举报