1. 程式人生 > 其它 >leetcode930——和相同的二元子陣列

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;
}