lc1895 幻方
二维前缀和--->行列前缀和
class Solution {
public:
int largestMagicSquare(vector<vector<int>>& grid)
{
int m=grid.size(),n=grid0.size();
vector<vector<int>> sum;
sum.resize(m + 1, vector<int>(n + 1));
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
++sumi + 1j + 1 = sumi + 1j + sumij + 1 - sumij + gridij;++
}
}
int mx=1;
for(int k=min(m,n);k>=1;k--)
{
for(int r1=0;r1<=m-k;r1++)
{
for(int c1=0;c1<=n-k;c1++)
{
int target = sumr1+1c1+k - sumr1+1c1 - sumr1c1+k + sumr1c1;
bool ok=true;
// 检查所有行和
for(int i=0;i<k && ok;i++)
if(sumr1+i+1c1+k-sumr1+i+1c1-sumr1+ic1+k+sumr1+ic1!=target)
ok=false;
// 检查所有列和
for(int j=0;j<k && ok;j++)
if(sumr1+kc1+j+1-sumr1+kc1+j-sumr1c1+j+1+sumr1c1+j!=target)
ok=false;
// 检查主对角线
int diag1=0;
for(int i=0;i<k && ok;i++) diag1+=gridr1+ic1+i;
if(diag1!=target) ok=false;
// 检查副对角线
int diag2=0;
for(int i=0;i<k && ok;i++) diag2+=gridr1+ic1+k-1-i;
if(diag2!=target) ok=false;
if(ok) return k;
}
}
}
return mx;
}
};
行列前缀和的写法
行列检查
for(int x=0; x<k && ok; x++)
++ok &= (rowi+xj+k-rowi+xj==t); // 行++
正反对角线表示法
for(int x=0; x<k && ok; x++)
d1+=gi+xj+x;
++d2+=gi+xj+k-1-x;++
class Solution {
public:
int largestMagicSquare(vector<vector<int>>& g) {
int m = g.size(), n = g0.size();
vector<vector<int>> row(m, vector<int>(n+1)), col(n, vector<int>(m+1));
// 预处理行/列前缀和
for(int i=0; i<m; i++) for(int j=0; j<n; j++) rowij+1 = rowij + gij;
for(int j=0; j<n; j++) for(int i=0; i<m; i++) colji+1 = colji + gij;
++for(int k=min(m,n); k>=1; k--) // 从大到小枚举++
++for(int i=0; i<=m-k; i++)++
++for(int j=0; j<=n-k; j++) {++
int t = rowij+k - rowij; // 第一行和为目标
bool ok=1;
for(int x=0; x<k && ok; x++)
ok &= (rowi+xj+k-rowi+xj==t); // 行
for(int y=0; y<k && ok; y++)
ok &= (colj+yi+k-colj+yi==t); // 列
int d1=0,d2=0;
for(int x=0; x<k && ok; x++) d1+=gi+xj+x, d2+=gi+xj+k-1-x;
++if(ok && d1==t && d2==t) return k;++
}
return 1;
}
};
lc1171
hash+presum
++组织结构:++
++unordered_map<int, ListNode*> presum;++
++// presum, node (memo)++
cur->next = presumsum->next;
class Solution {
//presum+hash
public:
ListNode* removeZeroSumSublists(ListNode* head)
{
ListNode* dummy = new ListNode(0);
dummy->next = head;
++unordered_map<int, ListNode*> prefix; // presum, node++
int sum = 0;
for (ListNode* cur = dummy; cur; cur = cur->next)
{
sum += cur->val;
prefixsum = cur;
}
sum = 0;
++for (ListNode* cur = dummy; cur; cur = cur->next)++
{
sum += cur->val;
++cur->next = prefixsum->next;++
}
return dummy->next;
}
};

lc659
hash模拟大法,记录使用
class Solution {
public:
bool isPossible(vector<int>& nums) {
unordered_map<int, int> cnt, end;
for (int num : nums) cntnum++;
for (int num : nums)
{
if (!cntnum) continue;
cntnum--;
if (endnum-1)
{
endnum-1--; //use
endnum++;
}
else if (cntnum+1 && cntnum+2) {
cntnum+1--; //use
cntnum+2--;
endnum+2++;
}
else
return false;
}
return true;
}
};