目录
和为K的子数组

java
public int subarraySum(int[] nums, int k) {
Map<Integer , Integer> hash = new HashMap<Integer , Integer>();
hash.put( 0 ,1);
//
int ret = 0 , sum = 0;
for(int x : nums ){
sum += x;
ret += hash.getOrDefault(sum - k,0);
hash.put(sum , hash.getOrDefault(sum , 0) + 1);
}
return ret;
}
和可被K整除的子数组

java
public int subarraysDivByK(int[] nums, int k) {
Map<Integer , Integer> hash = new HashMap<Integer , Integer>();
hash.put(0 % k ,1);
int sum = 0,ret = 0;
for(int x : nums){
sum += x;
int r = (sum % k+ k) % k;
ret += hash.getOrDefault(r,0);
hash.put(r , hash.getOrDefault(r ,0)+1);//对当前值再次重放
}
return ret;
}
连续数组

java
public int findMaxLength(int[] nums) {
Map<Integer, Integer> hash = new HashMap<Integer,Integer>();
hash.put(0,-1);
int sum = 0,ret = 0;
for(int i = 0; i<nums.length ; i++){
sum+= (nums[i] == 0 ? -1 : 1);
if(hash.containsKey(sum))
ret = Math.max(ret , i - hash.get(sum));
else
hash.put(sum,i);
}
return ret;
}
矩阵区域和
java
public int[][] matrixBlockSum(int[][] mat, int k) {
int m = mat.length, n = mat[0].length;
int[][] dp = new int[m+1][n+1];
for(int i = 1; i <=m ; i++){
for(int j =1 ; j<= n ;j++){
dp[i][j] = dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+mat[i - 1][j - 1];
}
}
int [][] ret = new int[m][n];
for(int i = 0 ; i<m ; i++){
for(int j = 0 ; j<n ; j++){
int x1 = Math.max(0,i - k) + 1,y1 = Math.max(0,j - k) + 1;
int x2 = Math.min(m - 1,i + k) + 1, y2=Math.min(n - 1,j + k) + 1;
ret[i][j] = dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] +dp[x1 - 1][y1 - 1];
}
}
return ret;
}

