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;

}

};

相关推荐
小O的算法实验室5 小时前
IEEE TASE,基于MPC的多无人机协同搜索竞争群体优化方法
算法
Tbisnic6 小时前
BGE-M3 算法详解:从模型架构到三种检索方式的数学原理
算法·自然语言处理·大模型·bert·transformer·注意力机制
Brilliantwxx6 小时前
【算法从零到千】【55-58】哈希位图+常见数学运算 接口
算法
空堂与归7 小时前
用户分群找不到规律?用K-Means聚类算法自动发现数据模式
算法·机器学习·kmeans·聚类
动词ing8 小时前
【C语言】自定义函数+指针入门
c语言·开发语言·算法
重生之后端学习8 小时前
283. 移动零[简单]✅
开发语言·数据结构·算法·leetcode·职场和发展
一只小小的芙厨8 小时前
基础数论总结
笔记·学习·算法
夜不会漫长10 小时前
C++入门(1)
开发语言·c++·算法
wen_zhufeng10 小时前
IndexTTS 2.5 技术报告
人工智能·算法·机器学习
大熊背11 小时前
树莓派相机自动白平衡详解(四)
算法·树莓派·白平衡·isppipeline