【Leetcode】325. Maximum Size Subarray Sum Equals k

題目地址:

https://leetcode.com/problems/maximum-size-subarray-sum-equals-k/

給定一個數組,求其最長的和爲kk的子區間的長度。由於是求子區間的問題,容易想到用前綴和數組來使得查詢效率更高。暴力的做法無非就是枚舉左端點,然後移動右端點,同時維護一個變量保存當前得到的和爲kk的最長區間的長度。爲了提高效率,可以用一個哈希表來保存前綴和及其下標(前綴和數組a[i]a[i]一般保存的是前ii個數字的和,並且ii00開始),這樣每次查詢的時候只需要check當前的前綴和減去kk是否在哈希表中就可以了。代碼如下:

import java.util.HashMap;
import java.util.Map;

public class Solution {
    public int maxSubArrayLen(int[] nums, int k) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        // key儲存前綴和,value儲存該前綴和對應的下標
        Map<Integer, Integer> memo = new HashMap<>();
        // 前0個數的前綴和就等於0
        memo.put(0, 0);
    	// cur儲存的是當前得到的前綴和,res儲存最終結果
        int cur = 0, res = 0;
        for (int i = 0; i < nums.length; i++) {
        	// 算一下當前的前綴和
            cur += nums[i];
            // 如果該前綴和不在哈希表裏,就將其加入,注意前綴和的下標表示的是前i個數
            if (!memo.containsKey(cur)) {
                memo.put(cur, i + 1);
            }
            // 如果cur - k在哈希表裏,就說明已經找到了一個區間其和爲k,更新res
            if (memo.containsKey(cur - k)) {
                res = Math.max(res, i + 1 - memo.get(cur - k));
            }
        }
        
        return res;
    }
}

時空複雜度O(n)O(n)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章