題目地址:
https://leetcode.com/problems/maximum-size-subarray-sum-equals-k/
給定一個數組,求其最長的和爲的子區間的長度。由於是求子區間的問題,容易想到用前綴和數組來使得查詢效率更高。暴力的做法無非就是枚舉左端點,然後移動右端點,同時維護一個變量保存當前得到的和爲的最長區間的長度。爲了提高效率,可以用一個哈希表來保存前綴和及其下標(前綴和數組一般保存的是前個數字的和,並且從開始),這樣每次查詢的時候只需要check當前的前綴和減去是否在哈希表中就可以了。代碼如下:
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;
}
}
時空複雜度。