iT邦幫忙

2026 iThome 鐵人賽

DAY 18
0
Software Development

30天刷完leetcoode75系列 第 18 篇

C++ 演算法練習 Day18|901, 1143 題解與思路分享

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20261002/20184265K0NfDlcELu.png

題目解析: 給定兩個字串,找出最長的共同子序列長度。子序列是指在不改變相對順序的情況下,刪除部分字元後產生的新字串
解題思路: 設二維陣列dp,大小是兩個字串長度加1,初始都設為0。丟進雙層迴圈把兩個字串的字元一個一個抓出來比對。如果字元一樣,就把左上角的值加1存進去;如果不一樣,就挑上方跟左方比較大的那個值存進去。迴圈跑完,陣列右下角最後一格的值就是答案

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        int n = text1.size(), m = text2.size();
        vector> dp(n + 1, vector(m + 1, 0));

        for (int i = 1; i <= n; i++){
            for (int j = 1; j <= m; j++){
                if (text1[i-1] == text2[j-1])
                    dp[i][j] = dp[i-1][j-1] + 1;
                else
                    dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
            }
        }
        
        return dp[n][m];
    }
};

https://ithelp.ithome.com.tw/upload/images/20261002/201842655BOV5NH8Fd.png

題目解析: 收集股票的每日報價,回傳今天價格的跨度。跨度是指從今天往回推算,連續幾天的價格小於或等於今天
解題思路: 設陣列v存價格跟索引,變數pos記天數。新價格進來時,如果陣列最後的價格小於等於今天,就把它拔掉,直到出現比今天大的價格為止。若陣列空了跨度就是pos+1,不然就是pos減去陣列最後面那天的索引。最後把今天價格跟索引塞進去,pos加1並回傳跨度

class StockSpanner {
public:
    StockSpanner() {
        
    }

    vector> v;
    int pos = 0;

    int next(int price) {
        while (!v.empty() && v.back().first <= price) {
            v.pop_back();
        }

        int ans = v.empty() ? pos + 1 : pos - v.back().second;

        v.push_back({price, pos});
        pos++;
        return ans;
    }
};

上一篇
C++ 演算法練習 Day17|739, 136, 338 題解與思路分享
下一篇
C++ 演算法練習 Day19|471, 17 題解與思路分享
系列文
30天刷完leetcoode75 共 22 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言