LeetCode 560:Subarray Sum Equals K

题意描述

给定一个整数数组和一个整数k,找出和为k的连续子数组的总数。

测试用例

Example 1:

Input:nums = [1,1,1], k = 2
Output: 2

解题思路

一、思路一

暴力解决

    public int subarraySum(int[] nums, int k) {
            int res = 0;
            int len = nums.length;
            for(int i=0;i<len;i++){
                int sum = nums[i];
                if(sum == k) res++;
                for(int j=i+1;j<len;j++){
                    sum += nums[j];
                    if(sum == k) res ++;
                }
            }
            return res;
        }

二、思路二

如果【i,j】的累加和为k,那么i之前的累加和为sum1,j之前的累加和为sum2,则存在sum2 - sum1 = k

所以我们简历Map存储累计和sum出现的次数,如果sum-k存在于map中,则累加和为k的子数组一定存在。

    public int subarraySum(int[] nums, int k) {
            HashMap<Integer, Integer> map = new HashMap<>();
            map.put(0,1);	//初始加入0,例如nums【0】=10,k=10,如果0不在map中就少一个res
            int res = 0;
            int cur = 0;
            for(int i=0;i<nums.length;i++){
                cur += nums[i];
                if(map.containsKey(cur-k)){
                    res += map.get(cur - k);
                }
                map.put(cur,map.getOrDefault(cur,0)+1);
            }
            return res;
        }
posted @ 2020-06-02 17:35  灵图  阅读(139)  评论(0编辑  收藏  举报