力扣第306场周赛 + AcWing第64场周赛补题
力扣
一.矩阵中的局部最大值
1.原题链接:
2.解题思路:
枚举每个3 * 3矩阵,求出最大值,ans即为答案矩阵
3.参考代码:
class Solution {
public:
vector<vector<int>> largestLocal(vector<vector<int>>& grid) {
int n = grid.size();
vector<vector<int>> ans(n - 2, vector<int>(n - 2, 0));
for (int r = 0; r < n - 2; r++) {
for (int c = 0; c < n - 2; c++) {
for (int i = r; i < r + 3; i++) {
for (int j = c; j < c + 3; j++) {
ans[r][c] = max(ans[r][c], grid[i][j]);
}
}
}
}
return ans;
}
};
二.边积分最高的节点
1.原题链接:
2.解题思路:
先用数组 cnt 表示到 i 的和,开long long 用 mx 表示最大值,然后找第一个是最大值的 cnt[ i ] 就是答案
3.参考代码:
class Solution {
public:
int edgeScore(vector<int>& edge) {
vector<long long>cnt(edge.size(), 0);
for(int i = 0; i < edge.size(); i++)cnt[edge[i]] += i;
long long mx = 0;
for(int i = 0; i < edge.size(); i++)mx = max(mx, cnt[i]);
for(int i = 0; i < edge.size(); i++)if(cnt[i] == mx)return i;
return 0;
}
};
AcWing
一.A + B
1.原题链接:
2.解题思路:
输入两个整数求和
3.参考代码:
#include<iostream>
using namespace std;
int main()
{
int a, b, s = 0;
cin >> a >> b;
s = a + b;
cout << s << endl;
return 0;
}
二.三国语言
1.原题链接:
2.解题思路:
每个国家的人说话的最后一个字符都不一样,只需要判断最后一个字符即可
3.参考代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
while(n--){
string s;
cin >> s;
int n = s.size();
if(s[n - 1] == o && s[n - 2] == p)puts("FILIPINO");
else if(s[n-1]==u&&s[n-2]==s&&s[n-3]==e&&s[n-4]==d||s[n-1]==u&&s[n-2]==s&&s[n-3]==a&&s[n-4]==m)puts("JAPANESE");
else puts("KOREAN");
}
}
三.子数组异或和
1.原题链接:
2.解题思路:
h[0]是下标为偶数的哈希表,h[1]是下标为奇数的哈希表 储存对应异或和相同的值的数量,从前往后遍历,判断前面与当前异或和值相同值的数量(保证奇偶一致),枚举起点和终点, 找到起点和终点相同的数的个数
3.参考代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<unordered_map>
using namespace std;
const int N = 300010;
typedef long long LL;
int n;
int a[N];
int main()
{
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
LL res = 0,sum = 0;
unordered_map<int, int> h[2];
h[0][sum]++;
for(int i = 1; i <= n; i++)
{
sum ^= a[i];
res += h[i % 2][sum];
h[i % 2][sum]++;
}
cout << res << endl;
return 0;
}
