hash+presum判等|幻方0

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;

}

};

相关推荐
hetao17338376 小时前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
Zootopia6267 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
longlongzihan7 小时前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
2601_960356388 小时前
2027校招采购岗解析:数学基础如何迁移到需求预测、成本与供应商分析
人工智能·算法
h_a_o777oah8 小时前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO98 小时前
指针的算术运算详解
java·数据结构·算法
Coder-magician8 小时前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论
垆边人似月.9 小时前
VLAN 资源池(100~200 分档)
数据结构·算法
潼心1412o9 小时前
C++初阶(长期更新)第6讲:类和对象(下)
开发语言·c++·算法
星光开发者10 小时前
基于决策树随机森林算法的小说推荐系统的设计与实现-计算机毕设【课程设计】78485
vue.js·算法·微信小程序·django·php·课程设计·express