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;

}

};

相关推荐
CS创新实验室3 小时前
算法、齿轮与硅基大脑:数值计算发展简史
人工智能·算法·数值计算
海石5 小时前
1563分的简单题,可能就简单在能被暴力AC
算法·leetcode
海石5 小时前
1400分的dp汗流浃背之【交替子数组计数】
算法·leetcode
奋发向前wcx5 小时前
P2590 树的统计 题目解析
数据结构·算法·深度优先
imbackneverdie6 小时前
AI4S不止于分子药物:以MedPeer为代表的科研基建打开产业新增量
大数据·人工智能·算法·aigc·科研·学术·ai 4s
额鹅恶饿呃7 小时前
C语言中的数据结构和变量
c语言·数据结构·算法
运行时记录8 小时前
prompt-optimizer skill
算法
万法若空8 小时前
【数据结构-哈希表】哈希表原理
数据结构·算法·散列表
退休倒计时8 小时前
【每日一题】LeetCode 437. 路径总和 III TypeScript
算法·leetcode·typescript
学逆向的9 小时前
汇编——内存
开发语言·汇编·算法·网络安全