這一題呢我其實看了很久,因為我不太懂他的意思。然後Chat gpt給了我一個很好的解釋,所以我想跟大家分享一下。
他說我們可以拿記帳來比喻,
像Example2:
Input: nums = [1,2,3], k = 3
Output: 2
就假設我們第一天花了1元,第二天2元,第三天3元,k是累積和,那我們要找的就是某個連續的日子我們剛好花了k元,所以就是第一天+第二天和第三天,這兩個連續的時段我們加起來的花費都是k元。所以我們要找的就是陣列裡,有幾個連續的子陣列總和是k。
我原本想一樣暴力的全都加一遍的,但這樣太慢了,而且時間複雜度很高。
所以就跟解數學一樣,如果要找某一段的加總,其實可以把現在自己加到的總合減之前記錄過的總和,如果這個結果有k就代表我走過的陣列中有一個符合連續陣列且總和=k的子陣列。
所以為了快速判斷之前出現過的總和,我會用HashMap來記錄,key就是出現過的總和
,value是這個總和出現的次數。這樣在遍歷陣列的時候,只要查現在的總和減k有沒有在HashMap裡,就會知道有多少段子陣列的加總等於 k。
class Solution {
public int subarraySum(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<>();
map.put(0, 1);
int sum = 0, count = 0;
for (int num : nums) {
sum += num; //累加現在位置的總和
//看看之前有沒有sum - k這個和
if (map.containsKey(sum - k)) {
count += map.get(sum - k);
}
map.put(sum, map.getOrDefault(sum, 0) + 1); // 更新出現次數
}
return count;
}
}
程式碼執行成功