力扣第305场周赛补题

第一题:6136. 算术三元组的数目

原题链接

思路:由于数据量很小,用三重循环遍历一遍即可

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

第二题:6139. 受限条件下可到达节点的数目

原题链接

思路:由于是树,一个节点可以指向多个节点,但每个节点都只有一个父亲节点,用无向图来进行存储(这个知识点还不会,在算法基础课里可以学),传参数时带上父亲节点就可以避免重复回去遍历,再满足限制的条件即可

class Solution {
public:
    int res = 0;
    vector<vector<int>> grid;//构造无向图
    vector<bool> limit;//记录限制节点

    void dfs(int u,int v){//u为当前节点,v为u的父节点
        res++;
        for(auto k : grid[u]){
            if(k != v && !limit[k]) dfs(k,u);//k不能是父节点,也不能是限制节点
        }
    }

    int reachableNodes(int n, vector<vector<int>>& edges, vector<int>& restricted) {
        grid.resize(n);
        limit.resize(n);

        for(auto &e : edges){
            grid[e[0]].push_back(e[1]);
            grid[e[1]].push_back(e[0]);
            //构造无向图  在算法基础课第二章里
        }

        for(auto k : restricted) limit[k] = true;

        dfs(0,-1);

        return res;
    }
};

第三题:6137. 检查数组是否存在有效划分

原题链接

思路:看了题解的线性dp,注意写状态转移方程时要注意条件已经边界,看着代码量较小但现在还没有能力自己写出来

class Solution {
public:
    bool validPartition(vector<int>& nums) {
        //线性dp
        int n = nums.size();
        vector<int> dp(n+1);//dp[i+1]表示nums[0]到nums[i]的有效划分
        dp[0] = true;//初始化

        for(int i = 1; i < n; i++){
            if(dp[i-1] && nums[i] == nums[i-1] || i > 1 && dp[i-2] && (nums[i] == nums[i-1] && nums[i] == nums[i-2] ||  nums[i] == nums[i-1] + 1 && nums[i] == nums[i-2] + 2))
            dp[i+1] = true;
        }//状态转移方程 三种条件满足一种即可
        
        return dp[n];
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值