iT邦幫忙

2025 iThome 鐵人賽

DAY 12
0
自我挑戰組

leetcode解題學習java系列 第 12

30天LeetCode挑戰紀錄-DAY12. Subarray Sum Equals K

  • 分享至 

  • xImage
  •  

題目

https://ithelp.ithome.com.tw/upload/images/20250926/20178158OQzJ4xmCJq.png
這一題呢我其實看了很久,因為我不太懂他的意思。然後Chat gpt給了我一個很好的解釋,所以我想跟大家分享一下。
他說我們可以拿記帳來比喻,
像Example2:
Input: nums = [1,2,3], k = 3
Output: 2
就假設我們第一天花了1元,第二天2元,第三天3元,k是累積和,那我們要找的就是某個連續的日子我們剛好花了k元,所以就是第一天+第二天和第三天,這兩個連續的時段我們加起來的花費都是k元。所以我們要找的就是陣列裡,有幾個連續的子陣列總和是k。

https://ithelp.ithome.com.tw/upload/images/20250926/201781589L1TbWOquL.png

想法

我原本想一樣暴力的全都加一遍的,但這樣太慢了,而且時間複雜度很高。
所以就跟解數學一樣,如果要找某一段的加總,其實可以把現在自己加到的總合減之前記錄過的總和,如果這個結果有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; 
    }
}

程式碼執行成功
https://ithelp.ithome.com.tw/upload/images/20250926/20178158Lbn3CjiREH.png


上一篇
30天LeetCode挑戰紀錄-DAY11. Group Anagrams
下一篇
30天LeetCode挑戰紀錄-DAY13. Longest Consecutive Sequence
系列文
leetcode解題學習java14
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言