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;

}

};

相关推荐
apcipot_rain3 小时前
计科八股20260616(2)/面经——线性代数对称阵求n次幂、概率论最大似然估计
算法
cici158743 小时前
彩色图像模糊增强(Fuzzy Enhancement)MATLAB 实现
开发语言·算法·matlab
宝贝儿好3 小时前
【LLM】第二章:HuggingFace入门学习
人工智能·深度学习·神经网络·学习·算法·自然语言处理
凌波粒4 小时前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
啵啵啵鱼4 小时前
数组---完
算法·排序算法
嘿黑嘿呦4 小时前
chap 8排序
算法·蓝桥杯·排序算法·软件工程
richdata4 小时前
需求预测终极指南:零售商品预测方法、算法与AI实践
人工智能·算法·零售
隔窗听雨眠4 小时前
C语言函数递归从入门到精通(下):性能优化与工程实践
c语言·算法·性能优化
退休倒计时5 小时前
【每日一题】LeetCode 146. LRU 缓存 TypeScript
算法·leetcode·缓存·typescript
珊瑚里的鱼5 小时前
【递归】汉诺塔
算法·深度优先