LeetCode 560. 和为K的子数组(Java)

  1. 和为K的子数组

给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。

示例 1 :
输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。

说明 :
数组的长度为 [1, 20,000]。
数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subarray-sum-equals-k
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法一:使用累计和,新建一个数组用来存放每个元素与之前所有元素的和,如果计算位于两个索引之间的元素之和,我们可以减去对应于两个索引的累积和以直接获得总和

class Solution {
    public int subarraySum(int[] nums, int k) {
        int count=0;
        //新建一个数组用来存放每个元素与之前所有元素的和
        int[] sum=new int[nums.length+1];
        sum[0]=0;
        for(int i=1;i<=nums.length;i++)
        {
            sum[i]=sum[i-1]+nums[i-1];
        }
        for(int start=0;start<sum.length-1;start++)
        {
            for(int end=start+1;end<sum.length;end++)
            {
            	//减去对应于两个索引的累积和以得到两个索引之间元素的累计和
                if(sum[end]-sum[start]==k)//如果两个索引之间的数的累计和为k,则为一个新的和为k的子数组
                {
                    count++;
                }
            }
        }
        return count;
    }
}

方法二:Hash Table,用一个哈希表来存放累加和,如果哈希表中包含key为累加和减去k的项,则将计数值加上对应key的val,然后将该累加和放到哈希表中,并将key为该累加和的val设为1,如果哈希表中已经存在key与该累加和相等,则将对应的key的val加一。

class Solution {
    public int subarraySum(int[] nums, int k) {
    	//新建一个哈希表来存放累加和
        HashMap<Integer,Integer> sum=new HashMap<>();
        int count=0;
        int sumNum=0;
        sum.put(0,1);
        //遍历数组中所有元素
        for(int i=0;i<nums.length;i++)
        {
            sumNum+=nums[i];//计算累加和
            //判断哈希表中是否包含key为累加和减去k的项
            if(sum.containsKey(sumNum-k))
            {
                count+=sum.get(sumNum-k);//如果包含则将计数值加上对应key的val
            }
            //无论哈希表中是否包含key为累加和减去k的项,都要将新的累加和加入哈希表中
            //如果不存在key与该累加和相等,则将该累加和与其val=1加入哈希表中,
            //如果哈希表中已经存在key与该累加和相等,则将对应的key的val加一
            sum.put(sumNum,sum.getOrDefault(sumNum,0)+1);
        }
        return count;
    }
}
发布了53 篇原创文章 · 获赞 0 · 访问量 1788

猜你喜欢

转载自blog.csdn.net/nuts_and_bolts/article/details/104873662