【2022-07-03-第300场单周赛】

总结
第二题磨了很多时间,码力有待加强。
Q1.解密消息
题目有点拗口,做起来简单。
class Solution {
public:
string decodeMessage(string k, string m) {
int h[26];
int t = 0;
for(int i = 0; i < 26; ++i) h[i] = -1;
for(auto c : k){
if(c != ' ' && h[c - 'a'] == -1) h[c - 'a'] = t++;
}
string ret;
for(auto c : m){
if(c != ' ')ret += h[c - 'a'] + 'a';
else ret += c;
}
return ret;
}
};
Q2.螺旋矩阵 IV
这种模拟题要多练练了,序列螺旋地写入矩阵调了半个小时。
class Solution {
public:
vector<vector<int>> spiralMatrix(int m, int n, ListNode* head) {
vector<vector<int>> g(m, vector<int> (n, -1));
vector<int> a;
while(head){
a.push_back(head->val);
head = head->next;
}
if(a.size() == 0) return g;
int l = 0, r = n - 1, u = 0, b = m - 1, t = 0, i = 0, j = 0;
// g[0][0] = a[t++];
while(t < a.size()){
for(j = l; j <= r && t < a.size(); ){
g[i][j] = a[t++];
if(j < r) ++j;
else break;
}
for(i = u + 1; i <= b && t < a.size(); ){
g[i][j] = a[t++];
if(i < b) ++i;
else break;
}
for(j = r - 1; j >= l && t < a.size(); ){
g[i][j] = a[t++];
if(j > l) --j;
else break;
}
for(i = b - 1; i >= u + 1 && t < a.size(); ){
g[i][j] = a[t++];
if(i > u + 1) --i;
else break;
}
l++, u++, r--, b--;
}
return g;
}
};
Q3.知道秘密的人数
直接暴力DP。
class Solution {
public:
const int M = 1e9 + 7;
int peopleAwareOfSecret(int n, int delay, int forget) {
int dp[n + 1]; memset(dp, 0, sizeof(dp)); dp[1] = 1;
for(int i = 2; i <= n; ++i){
for(int j = delay; j < forget && i - j >= 1; ++j){
dp[i] = (dp[i] + dp[i - j]) % M;
}
}
int ret = 0;
for(int i = n; i > n - forget; --i) ret = (ret + dp[i]) % M;
return ret;
}
};
Q4.网格图中递增路径的数目
DPDPDPDPDPDPDPDPDPDPDPDPDPDPDPDPDP
class Solution {
public:
const int M = 1e9 + 7;
int dx[4] = {1, -1, 0, 0}, dy[4] = {0, 0, 1, -1};
int countPaths(vector<vector<int>>& g) {
int m = g.size(), n = g[0].size();
long long dp[m][n];
vector<pair<int, int>> a;
for(int i = 0; i < m; ++i) for(int j = 0; j < n ; ++j) dp[i][j] = 1, a.push_back({i, j});
sort(a.begin(), a.end(), [&](const pair<int, int> &x, const pair<int, int> &y){
return g[x.first][x.second] > g[y.first][y.second];
});
for(auto &p : a){
int x = p.first, y = p.second;
for(int r = 0; r < 4; ++r){
int nx = x + dx[r], ny = y + dy[r];
if(nx >= 0 && ny >= 0 && nx < m && ny < n && g[nx][ny] > g[x][y]) dp[x][y] = (dp[x][y] + dp[nx][ny]) % M;
}
}
int ret = 0;
for(int i = 0; i < m; ++i) for(int j = 0; j < n; ++j) ret = (ret + dp[i][j]) % M;
return ret;
}
};
浙公网安备 33010602011771号