文章目录
前言
本专栏文章为《LeetCode 热题 100》的刷题题解,相关内容如有侵权,立即删除。
一、题目
1、原题链接
2、题目描述
二、个人思路整理
1、思路分析
核心思路:在遍历数组的同时,不断更新历史最低买入价,并计算当前价格卖出能赚的利润,实时维护最大利润。
核心公式:当天的最大收益=max(之前的最大收益,今天价格-历史最低价)
核心操作时:维护最小买入价格、计算新利润来维护最大利润。
复杂度分析
- 时间复杂度: O ( n ) O(n) O(n),一个
for循环,一次遍历。- 空间复杂度: O ( 1 ) O(1) O(1),仅变量空间,常数阶,未开辟其他辅助空间 。
2、解题代码
cpp
class Solution {
public:
int maxProfit(vector<int>& prices) {
int minPrice = INT_MAX; // 最低买入价格
int ans = 0; // 最大利润
for (auto price : prices) {
// 尝试更新最低买入价格
minPrice = min(minPrice, price);
// 尝试更新最大利润
ans = max(ans, price - minPrice);
}
return ans;
}
};
三、知识风暴
INT_MAX:定义在<climits>中,表示int的最大值(在绝大多数现代 32 位和 64 位系统中,int占 4 个字节(32 位)。其中最高位为符号位,因此int的取值范围是 − 2 31 -2^{31} −231 到 2 31 − 1 2^{31} - 1 231−1),INT_MAX具体数值为:2147483647(约 2.14 × 10 9 2.14 \times 10^9 2.14×109,即 21 亿多)。- 防溢出:对
INT_MAX做加法会溢出变负数,需做加法时改用long long或用0x3f3f3f3f(约 10 亿,图论/DP 常用无穷大)替代。

