题目链接:Leetcode121

思路:
- 1,找前面和它比最小的更新答案,可以维护一个单调栈解决,每次跟栈底比(实际上是单调队列,但不用控制窗口大小就是了)
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
if (n == 0) return 0;
int stk[n], top = -1;
int ans = 0;
for (int i = 0; i < n; i++) {
while (top!=-1 && stk[top]>=prices[i]) top--; //模拟一个单调栈
stk[++top]=prices[i];
ans=max(ans, stk[top]-stk[0]);
}
return ans;
}
};
- 2,动态规划,dp[i]表示到达i时最小的数,每次更新答案时与dp[i-1]求差值就好了
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
if (n == 0) return 0;
int bef; //int dp[n];
int ans = 0;
bef=prices[0]; //dp[0]=prices[0]; //初试状态
for (int i = 1; i < n; i++) {
/*
dp[i]=min(dp[i-1], prices[i]);
ans=max(ans, prices[i]-dp[i-1]); //在正数内所以不存在溢出的情况,因为负数比正数多一位
*/
ans=max(ans, prices[i]-bef);
bef=min(bef, prices[i]);
}
return ans;
}
};

本文深入探讨了LeetCode 121题目的两种高效解决方案:利用单调队列原理优化的栈方法,以及直观易懂的动态规划策略。通过实例演示如何在股票价格波动中寻找最大利润。
3174

被折叠的 条评论
为什么被折叠?



