方法:贪心
class Solution {
public:
int monotoneIncreasingDigits(int n) {
string s = to_string(n);
int m = s.size();
int idx = m;
for (int i = m - 1; i > 0; --i) {
if (s[i-1] > s[i]) {
idx = i;
s[i-1]--;
}
}
for (int i = idx; i < m; ++i) {
s[i] = '9';
}
return stoi(s);
}
};
$时间复杂度O(n),空间复杂度O(1)
方法:贪心
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int res = 0, minv = prices[0];
for (int i = 1; i < prices.size(); ++i) {
if (minv > prices[i]) minv = prices[i];
if (prices[i] >= minv && prices[i] <= minv + fee) continue;
if (prices[i] > minv + fee) {
res += prices[i] - minv - fee;
minv = prices[i] - fee;
}
}
return res;
}
};
$时间复杂度O(n),空间复杂度O(1)
方法:dp
f[i][0]:前i天持有股票的最大利润
f[i][1]:前i天未持有持有股票的最大利润
class Solution {
#define maxn 50010
int f[maxn][2];
public:
int maxProfit(vector<int>& prices, int fee) {
int n = prices.size();
f[0][0] -= prices[0];
for (int i = 1; i < prices.size(); ++i) {
f[i][0] = max(f[i-1][0], f[i-1][1] - prices[i]);
f[i][1] = max(f[i-1][1], f[i-1][0] + prices[i] - fee);
}
return max(f[n-1][0], f[n-1][1]);
}
};
$时间复杂度O(n),空间复杂度O(n)
方法:贪心
class Solution {
int res;
private:
int traversal(TreeNode* cur) {
if (cur == NULL) return 2;
int l = traversal(cur->left);
int r = traversal(cur->right);
if (l == 2 && r == 2) return 0;
if (l == 0 || r == 0) {
res++;
return 1;
}
if (l == 1 || r == 1) return 2;
return -1;
}
public:
int minCameraCover(TreeNode* root) {
if (!traversal(root)) ++res;
return res;
}
};
$时间复杂度O(n),空间复杂度O(n)