iT邦幫忙

2026 iThome 鐵人賽

DAY 19
0
Software Development

30天刷完leetcoode75系列 第 19 篇

C++ 演算法練習 Day19|471, 17 題解與思路分享

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20261003/20184265zNxg8qT39W.png

題目解析:給定一個陣列代表每天的股票價格,還有一筆固定的交易手續費,找出在可以無限次買賣的情況下,扣除手續費後最多能賺多少錢
解題思路:設變數ans記總利潤,變數buy記第一天的價格加上手續費當作初始成本。丟進迴圈從第二天開始跑,如果今天的價格加手續費比buy便宜,就把buy更新為今天的新成本;如果今天的價格大於buy,代表賣掉有賺錢,就把價差加進ans,並把buy更新為今天的價格當作新基準。迴圈跑完回傳ans

class Solution {
public:
    int maxProfit(vector& prices, int fee) {
        int ans = 0;
        int buy = prices[0] + fee;

        for (int i=1; i < prices.size(); i++) {
            if (prices[i] + fee < buy) {
                buy = prices[i] + fee;
            } else if (prices[i] > buy) {
                ans += prices[i] - buy;
                buy = prices[i];
            }
        }
        return ans;
    }
};

https://ithelp.ithome.com.tw/upload/images/20261003/20184265nOHjuGr4JX.png

題目解析:給定一串包含數字2到9的字串,依照傳統電話按鍵上的字母對應關係,找出這些數字可以組合出的所有字母組合
解題思路:先設一個陣列v把2到9對應的英文字母全部存好,再設一個陣列v1裝答案。如果輸入空字串就直接回傳空值。接著寫一個solve遞迴函數,每次把當前數字對應的字母用迴圈一個個抓出來,接在字串後面繼續往下遞迴,當字串長度跟輸入的數字一樣長時,就塞進v1裡面。最後回傳v1

class Solution {
public:
    vector v = vector(10), v1;

    vector letterCombinations(string digits) {
        v[2] = "abc";
        v[3] = "def";
        v[4] = "ghi";
        v[5] = "jkl";
        v[6] = "mno";
        v[7] = "pqrs";
        v[8] = "tuv";
        v[9] = "wxyz";

        if (digits.empty()) return {};
        solve(digits, "", 0);
        return v1;
    }

    void solve(string s, string ans, int q){
        if (s.size() != ans.size()) {
            int d = s[q] - '0';
            for (int i = 0; i < v[d].size(); i++) {
                solve(s, ans + v[d][i], q + 1);
            }
        } else {
            v1.push_back(ans);
        }
    }
};

上一篇
C++ 演算法練習 Day18|901, 1143 題解與思路分享
下一篇
C++ 演算法練習 Day20|1926, 374 題解與思路分享
系列文
30天刷完leetcoode75 共 22 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言