【牛客】美团2024年春招第一场笔试【技术】
1. 小美的平衡矩阵
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<vector<int>> nums;
for (int i = 0; i < n; i++) {
fgetc(stdin);
vector<int> nums_;
for (int j = 0; j < n; j++) {
int num = fgetc(stdin) - '0';
nums_.push_back(num);
}
nums.push_back(nums_);
}
vector<vector<int>> pre(n + 1, vector<int>(n + 1, 0));
for (int i = 1; i < n + 1; i++) {
for (int j = 1; j < n + 1; j++) {
pre[i][j] = pre[i][j - 1] + (pre[i - 1][j] - pre[i - 1][j - 1]) + nums[i - 1][j
- 1];
}
}
vector<int> res(n, 0);
for (int i = 2; i < n + 1; i++) {
for (int j = 2; j < n + 1; j++) {
for (int k = 2; k <= min(i, j); k += 2) {
if (pre[i][j] - pre[i - k][j] - pre[i][j - k] + pre[i - k][j - k] == k * k /
2) {
res[k - 1] += 1;
}
}
}
}
for (int i = 0; i < n; i++) {
cout << res[i] << endl;
}
return 0;
}
思路:
- 因为矩阵只有0和1,所以可以使用二维前缀和,只占任意一个i*i矩阵,如果总和为i*i/2,则符合要求。
- 遍历整个矩阵,作为小矩阵的右下角,遍历可能的边长i,判断是否符合要求。
遇到的问题:
- 输入问题:做力扣习惯了,一开始直接使用int接受行,发现会溢出,需要用fgetc()一个一个接受。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY