LeetCode刷題記錄(301-325)
阿新 • • 發佈:2021-11-13
301. 刪除無效的括號
Tag: 回溯
class Solution { public: vector<string> res; vector<string> removeInvalidParentheses(string s) { int lremove = 0; int rremove = 0; for (char c : s) { if (c == '(') { lremove++; } else if (c == ')') { if (lremove == 0) { rremove++; } else { lremove--; } } } helper(s, 0, lremove, rremove); return res; } void helper(string str, int start, int lremove, int rremove) { if (lremove == 0 && rremove == 0) { if (isValid(str)) { res.push_back(str); } return; } for (int i = start; i < str.size(); i++) { if (i != start && str[i] == str[i - 1]) { continue; } // 如果剩餘的字元無法滿足去掉的數量要求,直接返回 if (lremove + rremove > str.size() - i) { return; } // 嘗試去掉一個左括號 if (lremove > 0 && str[i] == '(') { helper(str.substr(0, i) + str.substr(i + 1), i, lremove - 1, rremove); } // 嘗試去掉一個右括號 if (rremove > 0 && str[i] == ')') { helper(str.substr(0, i) + str.substr(i + 1), i, lremove, rremove - 1); } } } inline bool isValid(const string& str) { int cnt = 0; for (int i = 0; i < str.size(); i++) { if (str[i] == '(') { cnt++; } else if (str[i] == ')') { cnt--; if (cnt < 0) { return false; } } } return cnt == 0; } };
309. 最佳買賣股票時機含冷凍期
Tag: 動態規劃
class Solution { public: int maxProfit(vector<int>& prices) { if (prices.empty()) { return 0; } int n = prices.size(); int f0 = -prices[0]; int f1 = 0; int f2 = 0; for (int i = 1; i < n; ++i) { int newf0 = max(f0, f2 - prices[i]); int newf1 = f0 + prices[i]; int newf2 = max(f1, f2); f0 = newf0; f1 = newf1; f2 = newf2; } return max(f1, f2); } };
312. 戳氣球
Tag: 動態規劃
class Solution { public: int maxCoins(vector<int>& nums) { int n = nums.size(); vector<vector<int>> rec(n + 2, vector<int>(n + 2)); vector<int> val(n + 2); val[0] = val[n + 1] = 1; for (int i = 1; i <= n; i++) { val[i] = nums[i - 1]; } for (int i = n - 1; i >= 0; i--) { for (int j = i + 2; j <= n + 1; j++) { for (int k = i + 1; k < j; k++) { int sum = val[i] * val[k] * val[j]; sum += rec[i][k] + rec[k][j]; rec[i][j] = max(rec[i][j], sum); } } } return rec[0][n + 1]; } };
313. 超級醜數
Tag: 動態規劃
class Solution {
public:
int nthSuperUglyNumber(int n, vector<int>& primes) {
vector<long> dp(n + 1);
int m = primes.size();
vector<int> pointers(m, 0);
vector<long> nums(m, 1);
for (int i = 1; i <= n; i++) {
long minNum = INT32_MAX;
for (int j = 0; j < m; j++) {
minNum = min(minNum, nums[j]);
}
dp[i] = minNum;
for (int j = 0; j < m; j++) {
if (nums[j] == minNum) {
pointers[j]++;
nums[j] = dp[pointers[j]] * primes[j];
}
}
}
return dp[n];
}
};
316. 去除重複字母
Tag: 單調棧
class Solution {
public:
string removeDuplicateLetters(string s) {
vector<int> vis(26), num(26);
for (char ch : s) {
num[ch - 'a']++;
}
string stk;
for (char ch : s) {
if (!vis[ch - 'a']) {
while (!stk.empty() && stk.back() > ch) {
if (num[stk.back() - 'a'] > 0) {
vis[stk.back() - 'a'] = 0;
stk.pop_back();
} else {
break;
}
}
vis[ch - 'a'] = 1;
stk.push_back(ch);
}
num[ch - 'a'] -= 1;
}
return stk;
}
};
318. 最大單詞長度乘積
Tag: 字串 位運算
class Solution {
public:
bool helper(const string& word1, const string& word2) {
int n1 = 0, n2 = 0;
auto f = [](char c) { return c - 'a'; };
for (auto& c : word1) {
n1 |= (1 << f(c));
}
for (auto& c : word2) {
n2 |= (1 << f(c));
}
return (n1 & n2) == 0;
}
int maxProduct(vector<string>& words) {
int res = 0;
for (int i = 0; i < words.size(); i++) {
for (int j = i + 1; j < words.size(); j++) {
if (helper(words[i], words[j])) {
int v = words[i].size() * words[j].size();
res = max(res, v);
}
}
}
return res;
}
};
319. 燈泡開關
Tag: 數學
class Solution {
public:
int bulbSwitch(int n) {
return sqrt(n); //return sqrt(n + 0.5);
}
};
322. 零錢兌換
Tag: 動態規劃
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
int n = coins.size();
const int IMPOSSIBLE = amount + 1;
vector<int> dp(amount + 1, IMPOSSIBLE);
dp[0] = 0;
for (int i = 1; i <= amount; i++) {
for (int j = 0; j < n; j++) {
if (i >= coins[j]) {
dp[i] = min(dp[i], dp[i - coins[j]] + 1);
}
}
}
return dp[amount] > amount ? -1 : dp[amount];
}
};
324. 擺動排序 II
Tag: 排序
class Solution {
public:
void wiggleSort(vector<int>& nums) {
sort(nums.begin(), nums.end());
int n = nums.size();
vector<int> sortNums(nums);
int left = (n - 1) / 2, right = n - 1;
for(int i = 0; i < n; i++) {
if((i & 1) == 0) {
nums[i] = sortNums[left--];
}else{
nums[i] = sortNums[right--];
}
}
}
};