classSolution{public:intmaxProfit(vector<int>&prices){int minv =2e9, res =0;for(auto p : prices){ res =max(res, p - minv); minv =min(minv, p);}return res;}};
class Solution {
public:
int maxProfit(vector<int>& prices) {
int res = 0;
for(int i = 0; i + 1 < prices.size(); i++)
res += max(0, prices[i + 1] - prices[i]);
return res;
}
};
class Solution {
public:
int maxProfit(vector<int>& prices) {
// 最多可以完成两笔交易 -> 枚举两次交易的分界点 前后缀分解
int n = prices.size();
vector<int> f(n + 2);
for(int i = 1, minp = INT_MAX; i <= n; i++)
{
f[i] = max(f[i - 1], prices[i - 1] - minp);
minp = min(minp, prices[i - 1]);
}
int res = 0;
for(int i = n, maxp = 0; i; i--)
{
res = max(res, maxp - prices[i - 1] + f[i - 1]);
maxp = max(maxp, prices[i - 1]);
}
return res;
}
};
class Solution {
public:
int res = INT_MIN;
public:
int dfs(TreeNode* root) {
if(root == nullptr) return 0;
int l = dfs(root->left);
int r = dfs(root->right);
//res = max(res, l + r + root->val); // 这是不对的 左右都可以不选
res = max(res, root->val);
res = max(res, root->val + l);
res = max(res, root->val + r);
res = max(res, root->val + l + r);
return max(0, max(l, r)) + root->val;
}
int maxPathSum(TreeNode* root)
{
dfs(root);
return res;
}
};
class Solution {
public:
bool isPalindrome(string s) {
int l = 0, r = s.size() - 1;
while(l < r)
{
while(l < r && !isalnum(s[l])) l++;
while(l < r && !isalnum(s[r])) r--;
if(l < r && tolower(s[l]) != tolower(s[r])) return false;
l++, r--;
}
return true;
}
};