每日一题——股票的最大利润

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述

假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?

示例 1:

输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。

示例 2:

输入: [7,6,4,3,1] 输出: 0 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

限制:

0 <= 数组长度 <= 10^5

解题思路

暴力解法

纯暴力做法,买股票一定在卖股票前,所以可以遍历一遍数组,在每一次循环中找到在i之前的最小元素,然后用当前的卖出价格减去在这之前的最小买入价格即可算出这个卖出价格可以获得的最大利润,在更新一下总的最大利润即可。

注意:此时因为有两重循环所以时间复杂度为O(n);如果数据集在大点,可能无法通过。

动态规划解法

状态表示: 用 dp数组 存储每天的股票最大利润,其具有的属性是第i天股票的最大值

状态计算:dp(n) = max(dp(n – 1), prices[n] – min);i – 1天股票的最大值和第i天股票的最大值的比较

代码

暴力解法

class Solution {
​
public:
​
  int maxProfit(vector<int>& prices) {
​
•    int length = prices.size();
​
•    if(length == 0) return 0;
​
•    int result = 0;
​
•    for(int i = 1;i < length;i ++)
​
•     {
​
​
​
•      int min1 = 1e9;
​
•      for(int j = 0;j < i;j ++)
​
•      {
​
•        if(min1 > prices[j]) min1 = prices[j];
​
•        
​
•      }
​
•      
​
•      result = max(result,prices[i] - min1);
​
•       //cout << result <<' ' << min1 <<endl;
​
​
​
•     } 
​
•    return result;
​
  }
​
};
复制代码

动态规划

class Solution {
public:
    const int N = 100010;
    int maxProfit(vector<int>& prices) {
        int length = prices.size();
        if(length == 0) return 0;
        int result = 0;
        int q[N];// 等于n - 1天股价的最大值和今天股票利润的比较
       
        int min = prices[0];
       
        for(int i = 1;i < length; i++)
        {
            if(min > prices[i]) min = prices[i];
            q[i] = max(q[i -1],prices[i] - min);
        }
​
        return q[length - 1];
    }
};
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享