【CT】LeetCode手撕—121. 买卖股票的最佳时机

目录

  • 题目
  • [1- 思路](#1- 思路)
  • [2- 实现](#2- 实现)
    • [⭐121. 买卖股票的最佳时机------题解思路](#⭐121. 买卖股票的最佳时机——题解思路)
  • [2- ACM实现](#2- ACM实现)

题目


1- 思路

模式识别

  • 模式1:只能某一天买入 ------> 买卖一次 ------> dp 一次的最大利润

动规五部曲

  • 1.定义dp数组,确定含义
    • dp[i][0] :第 i 天持有股票的最大收益
    • dp[i][1] :第 i 天没有股票的最大收益
  • 2.递推公式
    • 第 i 天持有股票 dp[i][0]
      • i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]
      • i天买入股票,所得现金就是买入今天的股票后所得现金即:-prices[i]
    • dp[i][0] = Math.max(dp[i - 1][0],-prices[i])
    • 第 i 天没有股票 dp[i][1]
      • i-1 天就没有股票 即 dp[i-1][1]
      • i-1 天有,第 i 天卖了 dp[i-1][0]+prices[i]
    • dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0]+prices[i])
  • 3.初始化
    • 第一天持有 dp[0][0] = -prices[i]、第一天没有 dp[0][1] = 0
  • 4.遍历顺序
    • 推导顺序为 从左到右 ,因此 i=1i<len

2- 实现

⭐121. 买卖股票的最佳时机------题解思路

java 复制代码
class Solution {
    public int maxProfit(int[] prices) {
        //1.定义 dp 数组
        // dp[i][0] 持有
        // dp[i][1] 没有
        int len = prices.length;
        int[][] dp = new int[len][2];

        //2.递推公式
        // dp[i][0] = Math.max(dp[i-1][0],-prices[i]);
        // dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0]+prices[i]);

        // 3. 初始化
        dp[0][0] = -prices[0];
        dp[0][1] = 0;

        //3.遍历顺序
        for(int i = 1 ; i < len;i++){
            dp[i][0] = Math.max(dp[i-1][0],-prices[i]);
            dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0]+prices[i]);
        }

        return dp[len-1][1];
    }
}

2- ACM实现

java 复制代码
public class bestTime {

    public static int maxProfit(int[] prices){
        // 1. 定义dp数组
        // dp[i][0] 持有
        // dp[i][1] 没有
        int len = prices.length;
        int[][] dp = new int[len][2];

        // 2.递推公式
        // dp[i][0] = Math.max(dp[i-1][0],-prices[i]);
        // dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0]+prices[i]);

        // 3. 初始化
        dp[0][0] = -prices[0];
        dp[0][1] = 0;

        //4.遍历
        for(int i = 1 ; i < len;i++){
             dp[i][0] = Math.max(dp[i-1][0],-prices[i]);
             dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0]+prices[i]);
        }
        return dp[len-1][1];
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入股价数组长度");
        int n = sc.nextInt();
        int[] prices = new int[n];
        System.out.println("输入数组值");
        for(int i = 0 ; i < n;i++){
            prices[i] = sc.nextInt();
        }

        System.out.println("最大利润为"+maxProfit(prices));
    }
}
相关推荐
luckys.one1 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
~|Bernard|2 小时前
在 PyCharm 里怎么“点鼠标”完成指令同样的运行操作
算法·conda
战术摸鱼大师2 小时前
电机控制(四)-级联PID控制器与参数整定(MATLAB&Simulink)
算法·matlab·运动控制·电机控制
Christo33 小时前
TFS-2018《On the convergence of the sparse possibilistic c-means algorithm》
人工智能·算法·机器学习·数据挖掘
好家伙VCC4 小时前
数学建模模型 全网最全 数学建模常见算法汇总 含代码分析讲解
大数据·嵌入式硬件·算法·数学建模
liulilittle5 小时前
IP校验和算法:从网络协议到SIMD深度优化
网络·c++·网络协议·tcp/ip·算法·ip·通信
bkspiderx7 小时前
C++经典的数据结构与算法之经典算法思想:贪心算法(Greedy)
数据结构·c++·算法·贪心算法
中华小当家呐8 小时前
算法之常见八大排序
数据结构·算法·排序算法
沐怡旸8 小时前
【算法--链表】114.二叉树展开为链表--通俗讲解
算法·面试
一只懒洋洋9 小时前
K-meas 聚类、KNN算法、决策树、随机森林
算法·决策树·聚类