class Solution {
public:
int findMaxLength(vector<int>& nums) {
int n = nums.size();
int preSum=0, maxLen=0;
unordered_map<int, int> map;
map[0] = -1;
for(int i=0; i<n; i++){
preSum += nums[i] ? 1 : -1;
if(map.find(preSum) != map.end()) maxLen = max(maxLen, i-map[preSum]);
else map[preSum] = i;
}
return maxLen;
}
};
12)左右两边子数组的和相等
class Solution {
public:
int pivotIndex(vector<int>& nums) {
int n = nums.size();
vector<int> prev(n+1);
prev[0] = 0;
for(int i=1; i<=n; i++){
prev[i] = prev[i-1] + nums[i-1];
}
for(int i=0; i<n; i++){
int left = prev[i];
int right = prev[n] - prev[i+1];
if(left==right) return i;
}
return -1;
}
};
13)二维子矩阵的和
class NumMatrix {
public:
vector<vector<int>> sum;
NumMatrix(vector<vector<int>>& matrix) {
int m = matrix.size();
int n = matrix[0].size();
sum.resize(m, vector<int>(n+1, 0));
for(int i=0; i<m; i++){
for(int j=1; j<=n; j++){
sum[i][j] = sum[i][j-1] + matrix[i][j-1];
}
}
}
int sumRegion(int row1, int col1, int row2, int col2) {
int res = 0;
for(int i=row1; i<=row2; i++){
res += sum[i][col2+1] - sum[i][col1];
}
return res;
}
};