iT邦幫忙

2021 iThome 鐵人賽

DAY 19
0
自我挑戰組

Leetcode刷題筆記系列 第 19

[Day 19] Leetcode 1137. N-th Tribonacci Number (C++)

  • 分享至 

  • xImage
  •  

前言

September LeetCoding Challenge 2021今天的題目是1137. N-th Tribonacci Number,跟DP最基礎經典的費氏數列基本一樣,只是多一個數字,就當作複習寫寫看吧!

想法

我們在Day 4的時候就有提過費氏數列的解法。可以來回顧一下最費時的方式就是recursive,我要求t(10)的時候就讓他去呼叫t(9)+t(8)+t(7),然後每個又回去呼叫本題,寫法如下:

class Solution {
public:
    int tribonacci(int n) {
        // use dp to save computed elements
        if(n==0){
            return 0;
        }else if(n==1){
            return 1;
        }else if(n==2){
            return 1;
        }
        
        return tribonacci(n-1)+tribonacci(n-2)+tribonacci(n-3);
    }
};

可以跑跑看體會一下時間感XD n每+1,時間是n倍數的在增加。
而經典的DP寫法如下:

class Solution {
public:
    int tribonacci(int n) {
        // use dp to save computed elements
        if(n==0){
            return 0;
        }else if(n==1){
            return 1;
        }else if(n==2){
            return 1;
        }
        vector<int> tri(n+1,0);
        tri[1]=1;
        tri[2]=1;
        for(int i=3;i<=n;++i){
            tri[i]=tri[i-1]+tri[i-2]+tri[i-3];
        }
        return tri[n];
    }
};

我們也有提到過其實每次只需要前三個數字,那我們也不需要維護一個n+1這麼大的table,只要每次保留最新的三組就好,節省一些些空間,如下:

class Solution {
public:
    int tribonacci(int n) {
        // use dp to save computed elements
        if(n==0){
            return 0;
        }else if(n==1){
            return 1;
        }else if(n==2){
            return 1;
        }
        int t1=0;
        int t2=1;
        int t3=1;
        int ans=t1+t2+t3;
        for(int i=3;i<=n;++i){
            ans = t1+t2+t3;
            t1 = t2;
            t2 = t3;
            t3 = ans;
        }
        return ans;
    }
};

時間複雜度就是O(n),因為從2~n我們每次會進行O(1)運算。

結語

今天的題目很簡單,就是DP系列的起點,還是要掌握好這個基本想法。


上一篇
[Day 18] Leetcode 1328. Break a Palindrome (C++)
下一篇
[Day 20] Leetcode 739. Daily Temperatures (C++)
系列文
Leetcode刷題筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言