- hashmap<count咖刃,index>
- map.containsKey()時更新最值不put,沒有時put
- 根據(jù)后面找前面拗军,不用初始化prefix數(shù)組或hashmap
560. Subarray Sum Equals K
Given an array of integers and an integer k, you need to find the total number of continuous subarrays whose sum equals to k.
Example 1:
Input:nums = [1,1,1], k = 2
Output: 2
思路一致鹊碍,不過對于hashmap的設(shè)計(jì)需要注意厌殉,跟其他題目不一樣的地方是不是找最長的subarray,所以設(shè)計(jì)要不一樣侈咕。
public int subarraySum(int[] nums, int k) {
// map to store prefix sum array
// key is prefix sum value is index
Map<Integer, Integer> map = new HashMap<>();
int sum = 0;
int res = 0;
map.put(0, 1);
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
if (map.containsKey(sum - k)) {
res += map.get(sum - k);
}
map.put(sum, map.getOrDefault(sum, 0) + 1);
}
return res;
}
Given a list of non-negative numbers and a target integer k, write a function to check if the array has a continuous subarray of size at least 2 that sums up to the multiple of k, that is, sums up to n*k where n is also an integer.
Example 1:
Input: [23, 2, 4, 6, 7], k=6
Output: True
Explanation: Because [2, 4] is a continuous subarray of size 2 and sums up to 6.
余數(shù)放在map里
ex 【2公罕,4】2%6 = 2 (4+2)% 6 = 0
public boolean checkSubarraySum(int[] nums, int k) {
if (nums == null || nums.length == 0) {
return false;
}
Map<Integer, Integer> map = new HashMap<>();
int sum = 0;
// hold the position
map.put(0, -1);
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
if (k != 0) {
sum = sum % k;
}
if (map.containsKey(sum)) {
// make sure at least subarray has more than 2 elements
if (i - map.get(sum) > 1) {
return true;
}
} else {
map.put(sum, i);
}
}
return false;
}
325. Maximum Size Subarray Sum Equals k
Given nums = [1, -1, 5, -2, 3], k = 3,
return 4. (because the subarray [1, -1, 5, -2] sums to 3 and is the longest)
Subarray類題目需要想到前綴和數(shù)組,優(yōu)化?Hashmap
sum(i~j) = PrefixSum(j+1) - PrefixSum(i) PrefixSum[0] = 0
public int maxSubArrayLen(int[] nums, int k) {
if(nums == null || nums.length == 0) return 0;
int length = nums.length, sum = 0, maxSubLen = 0;
//Using a hash map to store the sum of all the values before and include nums[i]
Map<Integer, Integer> map = new HashMap();
for(int i = 0; i < length; i++) {
sum += nums[i];
if(sum == k) {
maxSubLen = Math.max(maxSubLen, i + 1);
} else if(map.containsKey(sum - k)) {
maxSubLen = Math.max(maxSubLen, i - map.get(sum - k));
}
if(!map.containsKey(sum)) {
map.put(sum, i);
}
}
return maxSubLen;
}
525. Contiguous Array
Given a binary array, find the maximum length of a contiguous subarray with equal number of 0 and 1.
給一個binary數(shù)組耀销,找出最長的子數(shù)組楼眷,0,1數(shù)量相等
1 max初始化為0熊尉,如果(0罐柳,0,0狰住,0)情況
2 contain時不put
3 用一個count變量記錄就夠了
public int findMaxLength(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
int count = 0;
int max = 0;
Map<Integer, Integer> map = new HashMap<>();
map.put(0, -1);
for (int i = 0; i < nums.length; i++) {
if (nums[i] == 0) {
count++;
} else {
count--;
}
if (map.containsKey(count)) {
// if contains no put, get the leftmost
max = Math.max(max, i - map.get(count));
} else {
map.put(count, i);
}
}
return max;
}