【LeetCode】第 305 场周赛题解

179 阅读1分钟

6136. 算术三元组的数目

题解:暴力枚举

class Solution {
public:
    int arithmeticTriplets(vector<int>& nums, int diff) {
        int n = nums.size();
        int res = 0;
        for(int i=0; i<n; i++)
            for(int j = i+1; j<n; j++)
                for(int k=j+1; k<n; k++){
                    if(nums[k]-nums[j] == diff && nums[j]-nums[i] == diff){
                        res++;
                    }
                }
        return res;
    }
};

6139. 受限条件下可到达节点的数目

题解: BFS

class Solution {
public:
    int reachableNodes(int n, vector<vector<int>>& edges, vector<int>& restricted) {
        map<int, vector<int>> g;
        for(auto e : edges){
            g[e[0]].push_back(e[1]);
            g[e[1]].push_back(e[0]);
        }
        set<int> hash;
        for(auto r : restricted){
            hash.insert(r);
        }
        queue<int> q;
        q.push(0);
        hash.insert(0);
        int res = 1;
        while(q.size()){
            auto t = q.front();
            q.pop();
            for(auto c : g[t]){
                if(!hash.count(c)){
                    q.push(c);
                    res++;
                    hash.insert(c);
                }
            }
        }
        return res;
    }
};

6137. 检查数组是否存在有效划分

题解: 动态规划
状态表示:f[i] 表示前 i 个数是否能构成有效划分
f[i] = (f[i-1] && nums[i-1] == nums[i-2])
|| (f[i-3] && nums[i-1]==nums[i-2] && nums[i-3] == nums[i-2]) (i>=3)
|| (f[i-3] && nums[i-3]+1 == nums[i-2] && nums[i-2]+1 == nums[i-1]) (i>=3)

class Solution {
public:
    bool validPartition(vector<int>& nums) {
        int n = nums.size();
        vector<bool> f(n+1);
        f[0] = true;
        f[1] = false;
        for(int i=2; i<=n; i++){
            f[i] = false;
            if(nums[i-1] == nums[i-2] && f[i-2]){
                f[i] = true;
            }
            if(i >=3 && nums[i-1] == nums[i-2] && nums[i-2] == nums[i-3] && f[i-3]){
                f[i] = true;
            }
            if(i >= 3 && nums[i-1] == nums[i-2]+1 && nums[i-2] == nums[i-3]+1 && f[i-3]){
                f[i] = true;
            }
        } 
        return f[n];
    }
};

6138. 最长理想子序列

题解:动态规划
状态表示: f[i][j]f[i][j] 表示前 n 个字段 可以 a+j'a'+j 结尾的最长理想子序列
动态方程: f[i][p]=max(f[i][p],f[i1][j]+1),0<=j<26,abs(pj)<=kf[i][p] = max(f[i][p], f[i-1][j]+1), 0 <= j < 26, abs(p-j)<=k

class Solution {
public:
    int longestIdealString(string s, int k) {
        int n = s.size();
        vector<vector<int>> f(n+1, vector<int>(26, 0));
        for(int i=1; i<=n; i++){
            int p = s[i-1]-'a';
            f[i] = f[i-1]; // 其他字母结尾的复制过来
            for(int j=0; j<26; j++){ //  s[i-1] 结尾的字符进行比较
                if(abs(j-p) <= k){
                    f[i][p] = max(f[i][p], f[i-1][j]+1);
                }
            }
        }
        int res = 0;
        // 前 n 个字母, 26个字母结尾中最大长度
        for(int i=0; i<26; i++){
            res = max(res, f[n][i]);
        }
        return res;
    }
};