leetcode930——和相同的二元子数组

题意转换

给你一个二元数组 nums,和一个整数 goal,请你统计并返回有多少个和为 goal 的非空子数组。子数组是数组的一段连续部分。

因为这个二元数组是0,1组成,因此开始写的滑动窗口代码对下一个是0的元素情况考虑不到,后来看了官方的解法,哈希表。

【思路】
我们可以计算一个前缀和sum,每一个新的前缀和都是当前元素+前面所有元素,假设和为goal的非空子数组在一个区间[i, j]里面,就有:sum[j] - sum[i] = goal,那么我们只需要计算在sum[j]之前有多少个sum[i]满足条件即可;
所以枚举这个j,并累加满足公式的i的个数。使用哈希表存储每个前缀和值以及这个前缀和值出现的次数,遍历数组每个元素,当前元素对应j下表元素;
1、将当前前缀和值存入
2、计算前缀和
3、获取个数

点击查看代码

public static int numSubarraysWithSum(int[] nums, int goal) {
int total = 0, res = 0;
HashMap<Integer, Integer> hashMap = new HashMap<>();
/*
* 转换题意: 因为数组[i, j]的区间和为goal,也就是说我们计算一个前缀和total,每次都是之前的元素之和
* total[j] - total[i] = goal
* 因此只需要枚举每个j,找到满足这个等式的i的数量进行累加
* 1、首先把每一次的前缀和total放入map,值是它的个数
* 2、累加前缀和
* 3、获取当前j下标时,符合等式的i的个数,让结果集加上这个个数
* */
for (int num : nums) {
hashMap.put(total, hashMap.getOrDefault(total, 0) + 1);
total += num;
res += hashMap.getOrDefault(total - goal, 0);
}
return res;
}

posted @ 2021-10-22 19:08  精神小土豆  阅读(59)  评论(0)    收藏  举报