【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;
    }
};
posted on 2022-07-03 16:48  damnglamour  阅读(19)  评论(0)    收藏  举报