代码随想录算法训练营day46|139.单词拆分 剑指Offer10-I.斐波那契数列 10-II.青蛙跳台阶问题

139.单词拆分

题目链接

思路:姑且认为这是一道排列题。

class Solution {
public:
    bool wordBreak(string s, vector& wordDict) {
        unordered_set wordset(wordDict.begin(),wordDict.end());
        vector dp(s.size()+1,false);
        dp[0]=true;
        for(int i=1;i<=s.size();i++){
            for(int j=0;j

转换成unordered_set是为了提高查找效率,降低时间复杂度,它的底层实现是哈希表,所以查找时间复杂度是O(1),之前是O(n),如果用set的话是O(nlogn)。 

剑指Offer10-I.斐波那契数列

题目链接

本题递归的解法部分用例会超时。所以用动态规划的解法。

首先用dp数组:

class Solution {
public:
    int fib(int n) {
        if(n<2) return n;
        vector dp(n+1);
        dp[0]=0;
        dp[1]=1;
        for(int i=2;i<=n;i++){
            dp[i]=dp[i-1]+dp[i-2];
            dp[i]%=1000000007;
        }
        return dp[n];
    }
};

注意不能直接对1e9+7取模,因为这是一个双精度浮点数,而dp数组是一个整数数组。

我们并不用维护dp数组,只需要维护三个变量即可。

class Solution {
public:
    int fib(int n) {
        if(n<2) return n;
        vector dp(2);
        dp[0]=0;
        dp[1]=1;
        int sum;
        for(int i=2;i<=n;i++){
            sum=dp[0]+dp[1];
            sum%=1000000007;
            dp[0]=dp[1];
            dp[1]=sum;
        }
        return dp[1];
    }
};

10-II.青蛙跳台阶问题

题目链接

本题直接给出来了dp[0]=1,那就好说了,否则dp[0]是没有意义的,我们直接从dp[1]开始初始化就行。其实就是斐波那契数列,dp[i]表示到达i阶楼梯有dp[i]种方法。

class Solution {
public:
    int numWays(int n) {
        if(n==0) return 1;//直接站在原地就是一种方法
        if(n==1) return 1;
        vector dp(n+1);
        dp[0]=1;
        dp[1]=1;//到达1阶有dp[1]种方法
        for(int i=2;i<=n;i++){
            dp[i]=dp[i-1]+dp[i-2];
            dp[i]%=1000000007;
        }
        return dp[n];
    }
};

错因:n==0的时候返回数值没有做特殊处理。 

63. 股票的最大利润

题目链接

1、每一天都有两种状态:持有股票和不持有股票,所以需要二维数组来记录每一天的状态。dp[i][0]表示第i天持有股票拥有的最大现金,dp[i][1]表示第i天不持有股票拥有的最大现金。

2、递推公式。dp[i][0]可以由两种状态推到过来,可能是第i天之前就买入了,然后就延续这种状态,也可能是第i天买入的,刚刚改变,所以dp[i][0]=max(dp[i-1][0],-prices[i])(因为只买卖一次,开始现金是0,所以直接取负的就好);dp[i][1]也是由两种状态推来,可能是之前就卖出了,也可能是当天刚卖出(那前一天一定是持有的状态),dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i])

3、如何初始化dp数组。dp[0][0]是-prices[0],dp[0][1]是0

4、遍历顺序。根据递推公式,当前的状态是由前一天的状态推导来,所以就是从前往后遍历。

5、出错后要打印dp数组进行debug

class Solution {
public:
    int maxProfit(vector& prices) {
        int len=prices.size();
        if(len==0) return 0;
        vector> dp(len,vector(2));
        dp[0][0]=-prices[0];
        dp[0][1]=0;
        for(int i=1;i

错因:开始没有对空数组进行判断,如果为空直接返回0。

你可能感兴趣的:(算法,leetcode,动态规划)