2020-08-16刷题

  1. leetcode-LCP 07. 传递信息
    题型:动态规划
    难度:简单
    题目:小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下:有 n 名玩家,所有玩家编号分别为 0 ~ n-1,其中小朋友 A 的编号为 0,每个玩家都有固定的若干个可传信息的其他玩家(也可能没有)。传信息的关系是单向的(比如 A 可以向 B 传信息,但 B 不能向 A 传信息)。每轮信息必须需要传递给另一个人,且信息可重复经过同一个人给定总玩家数 n,以及按 [玩家编号,对应可传递玩家编号] 关系组成的二维数组 relation。返回信息从小 A (编号 0 ) 经过 k 轮传递到编号为 n-1 的小伙伴处的方案数;若不能到达,返回 0。
    代码:
class Solution {
public:
    //本题用动态规划去做,dp[i][j],i为轮数,j为目的地。
    //relation数组中,每个字数组有两个元素,relation[1]是终点,那么relation[1]就是终点的前一个。所以每个终点都依赖于前一个点。
    //列出动态方程: dp[k][ralation[j][1]] = dp[k-1][ralation[j-1][0]];j,1是终点,前一个是j,0。求总数,就是这个终点的所有前一个,加在一起。
    int numWays(int n, vector<vector<int>>& relation, int k) {
        //2 <= n <= 10   1 <= k <= 5
        int nlen = n;
        int dp[k+1][nlen];
        memset(dp,0,sizeof(dp));
        //如果轮数为0,数组为0,方案一定为1
        dp[0][0] = 1;
        for(int i=1;i<=k;i++)
        {
            for(int j=0;j<relation.size();j++)
            {
                dp[i][relation[j][1]] += dp[i-1][relation[j][0]];
            }
        }
        return dp[k][nlen-1];
    }
};

借鉴:https://leetcode-cn.com/problems/chuan-di-xin-xi/solution/chuan-di-xin-xi-by-leetcode-solution/

  1. leetcode-39组合总和
    题型:回溯
    难度:中等
    题目:给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。
    说明:
    所有数字(包括 target)都是正整数。
    解集不能包含重复的组合。
    代码:
class Solution {
private:
    vector<int> tempvec;
public:
    //回溯思想:不合适就退回到下一步
    //递归,记录每次的起始下标,依次遍历。只要满足条件就加入数组,并且处理下一个;
    //递归结束条件:如果等于0,加入到大数组中;
    void huisu(vector<int>& candidates, vector<vector<int> > &vec,int target,int cur,int begin){
        if(cur == target)
        {
            vec.push_back(tempvec);
            return;
        }
        else
        {
            for(int i=begin;i<candidates.size();i++)
            {
                if(cur+candidates[i] <= target)
                {
                    //将当前元素放入小数组
                    tempvec.push_back(candidates[i]);
                    //继续放相同的元素,因为可以重复
                    huisu(candidates,vec,target,cur+candidates[i],i);
                    //如果代码走到这里,不是大于就是等于,等于一定也处理过,把新装节点删除
                    tempvec.pop_back();
                }
            }
        }
    }
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        vector<vector<int> > vec;
        huisu(candidates,vec,target,0,0);
        return vec;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值