leetcode_121 买卖股票的最佳时期

1. 题意

有一个股价变化图,你可以在一天买入,在未来一天卖出。

求通过这样一次操作的最大获利。

2. 题解

2.1 枚举

直接枚举,买入卖出的时间,肯定会超时啦~

时间复杂度为 O ( n 2 ) O(n^2) O(n2)

空间复杂度为 O ( 1 ) O(1) O(1)

cpp 复制代码
class Solution {
public:
    int maxProfit(vector<int>& prices) {

        
        int ans = 0;

        int n = prices.size();

        for (int i = 0;i < n;++i) {
            for(int j = i + 1;j < n; ++j) {
                ans = max(ans, prices[j] - prices[i]);
            }
        }
        return ans;
    }
};
2.2 贪心

我们不难想到,我们每次卖股票的时候,只需要买入当前股票之前最低股份的股票就可以了!因此我们可以边统计最低股价,一边计算差值的最大值。

cpp 复制代码
class Solution {
public:
  int maxProfit(vector<int>& prices) {
        
        int n = prices.size();
        int ans = 0;
        int mn = prices[0];

        for (int i = 1; i < n; ++i) {
            ans = max(prices[i] - mn, ans);
            mn  = min(mn, prices[i]);
        }

        return ans;
  }
};
2.3 动态规划

动态规划的思路和贪心的感觉差不多,也不知道这算不算动态规划~

我们用 d p i dpi dpi表示卖出的股票是 p r i c e s i pricesi pricesi时的最大差值。

因此 a n s = max ⁡ { d p i ∣ 1 ≤ i ≤ p r i c e s . s i z e ( ) − 1 } ans=\max \left\{dpi\ \Big |\ 1\le i \le prices.size()-1 \right\} ans=max{dpi 1≤i≤prices.size()−1}。

同样对于 d p i dpi dpi,我们需要知道 i i i之前的最小股份,所以最终代码跟

贪心差不多?空间优化完后,代码估计就跟贪心一样,就不写了。

cpp 复制代码
class Solution {
public:
    int maxProfit(vector<int>& prices) {

        int n   = prices.size();
        int ans = 0;
        vector<int> dp(n + 1, 0);

        int mn = prices[0];
        for (int i = 0;i < n; ++i) {
            dp[i + 1] = max( dp[i], prices[i] - mn);
            mn = min( prices[i], mn);
        }
        return dp[n];
    }
};
2.4 差分+动态规划

这个题目跟lc53 最大子数组和, 是相互变形的关系。

其实也就是差分和前缀和的关系。

lc53可以通过前缀和转换成这个问题,当然这个问题也可以通过差分变成

最大子数组和。贴个代码吧,也懒得再解释了OvO

cpp 复制代码
class Solution {
public:
  int maxProfit(vector<int>& prices) {
    
        adjacent_difference( prices.begin(), prices.end(), prices.begin());
        
        prices[0] = 0;
        int ans = 0;
        int pre = 0;
        for (auto v: prices) {
            pre += v;
            ans = max( pre, ans);
            if (pre < 0)
                pre = 0;
        }

        return ans;
  }
};
相关推荐
To_OC7 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
2401_841495648 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
醇氧10 小时前
CountDownLatch / CyclicBarrier / Semaphore 面试高频问答清单
前端·面试·职场和发展
爱刷碗的苏泓舒12 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
谙弆悕博士13 小时前
系统集成项目管理工程师教程(第3版)笔记——第17章:法律法规和标准规范
笔记·职场和发展·学习方法·业界资讯·软考·法律·法规
烬羽14 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法
闪电悠米15 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法
星空露珠15 小时前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua
QXWZ_IA17 小时前
桥梁数字孪生怎么落地?
人工智能·科技·算法·智能硬件·政务