
題目解析:給定一個陣列代表每天的股票價格,還有一筆固定的交易手續費,找出在可以無限次買賣的情況下,扣除手續費後最多能賺多少錢
解題思路:設變數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;
}
};

題目解析:給定一串包含數字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);
}
}
};