public class Solution { /** * 原问题:字段奇数数量 * 新问题转化为:奇数看为1,偶数看为了(其实就是把数 % 2),统计字段和为K的字段数量 * sum(l,r) == k * S[r] - S[l - 1] == k S是字段和数组 * 其实就是两数之差问题。枚举右端i(r),只需找到i 前面右多少个j(l-1)满足s[i] - s[j] == k * @param nums * @param k * @return */ public int numberOfSubarrays(int[] nums, int k) { Integer res = 0; // 1:先计算出前缀和数组。注意前缀和数组要比nums长一位,因为为了方便从下表1开始走 int[] s = new int[nums.length + 1]; s[0] = 0; for(int i = 1;i <= nums.length;i++){ //这里加数组的值 s[i] = s[i - 1] + nums[i - 1]%2; } //3 : 接下来就变成两数之差问题了。 Map<Integer,Integer> map = new HashMap<>(); for(int i : s){ if(i - k >= 0){ res = res + map.getOrDefault(i-k,0); } int num = map.getOrDefault(i,0) + 1; map.put(i,num); } return res; }}