贪心的思路:

得到最小值,再挨个用数组中的值减去最小值,最终值取一个最大的

class Solution {
public:int maxProfit(vector<int>& prices) {// 贪心: 找到最小的,然后逐个减掉最小的,取最终值为最大的为 res int low = INT_MAX;int res = 0;for(int i = 0; i < prices.size(); i++){low = min(prices[i], low);res = max(res, prices[i] - low);}return res;}
};

动规的思路:

现在觉得做动规的关键点就是找出,当前的状态是否与之前的状态有关,也就是说:当前一般会有两种状态,具体哪一种为最优,需要依靠之前的状态及逆行推导。

比如说本题

当天有两种状态:持有股票,和不持有股票。(这里没有使用买入、卖出作为含义是因为:单纯的买入,卖出,无法表示出更确切的状态。比如说前一天买入,后一天不进行任何操作,那么这个不进行操作的状态就无法表示了

1. dp数组的表示含义

这里使用二维数组的原因是因为,一个维度表示天数,一个维度表示股票的状态

dp [ i ] [ 0 ] 表示第 i 天持有股票,值为:所获得的利润

dp [ i ] [ 1 ] 表示第 i 天不持有股票, 值为:所获得的利润

2. 递推公式

持有股票:

第 i 天买入的: -price[ i ]

第 i 天之前就买入了:dp[ i  - 1][ 0 ]

两者取最大值

不持有股票:

第 i 天卖出: dp [ i - 1][ 0 ] + price[ i ]

第 i 天之前就卖出了: dp [ i - 1 ][ 1 ]

两者取最大值

3. 初始化

dp[ 0 ] [ 0 ] =  - price[ 0 ]

dp[ 0 ] [ 1 ] = 0

4. 遍历顺序,从前向后

注意:

这里最终求的其实就是

dp [ price.size() - 1] [ 1 ]

因为最后一定是手里没有股票的利润会更大

class Solution {
public:int maxProfit(vector<int>& prices) {vector<vector<int>> dp(prices.size(), vector<int>(2));// 初始化dp[0][0] = -prices[0];dp[0][1] = 0;// 遍历 + 递推for(int i = 1; i < prices.size(); i++){dp[i][0] = max(dp[i - 1][0], -prices[i]);dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);}return dp[prices.size() - 1][1];}
};

3. 双指针

一个指向前一天,一个指向当天,这样就保证只会在买入后卖出,找出利润最大的

class Solution {
public:int maxProfit(vector<int>& prices) {// 双指针int left = 0 ,right = 1;int res = 0;for(; right < prices.size();){int x = prices[right] - prices[left];if(x > 0)   // 不断移动  right,继续寻找更大的利润{res = max(res, x);right++;} else   //如果利润为负数 让 left 尽可能小,然后移动一次right {left = right; // 注意这里是直接移动到right , 让 left 处于尽可能小的位置right++;} }return res;}
};

leetcode 121. 买卖股票的最佳时机 (贪心 + 动规 + 双指针相关推荐

  1. LeetCode #121 买卖股票的最佳时机 贪心 单调栈 动态规划

    LeetCode #121 买卖股票的最佳时机 题目描述 给定一个数组,它的第 iii 个元素是一支给定股票第 iii 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算 ...

  2. 158. Leetcode 121. 买卖股票的最佳时机 (贪心算法-股票题目)

    class Solution:def maxProfit(self, prices: List[int]) -> int:low, max_profit = float("inf&qu ...

  3. leetcode - 121.买卖股票的最佳时机

    121.买卖股票的最佳时机 ------------------------------------------ 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成 ...

  4. LeetCode - 121. 买卖股票的最佳时机

    121. 买卖股票的最佳时机 class Solution {public int maxProfit(int[] prices) {if (prices == null || prices.leng ...

  5. LeetCode 121:买卖股票的最佳时机 思考分析

    题目描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润. 注意:你不能在买入股票 ...

  6. leetcode.121. 买卖股票的最佳时机(best-time-to-buy-and-sell-stock)

    文章目录 121. 买卖股票的最佳时机 代码与思路 暴力法 一次遍历 单调栈 122. 买卖股票的最佳时机 II 代码与思路 股票问题系列通解 121. 买卖股票的最佳时机 给定一个数组,它的第 i ...

  7. 105. Leetcode 121. 买卖股票的最佳时机 (动态规划-股票交易)

    给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格. 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票.设计一个算法来 ...

  8. LeetCode: 121. 买卖股票的最佳时机(C++)

    题目: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票 ...

  9. LeetCode 121. 买卖股票的最佳时机(Best Time to Buy and Sell Stock)

    简单粗暴的第一种解法: class Solution { public:int maxProfit(vector<int>& prices) {int m = prices.siz ...

最新文章

  1. php ajax formdata 进度,使用formdata使用ajax将数据发送到PHP
  2. [Cocoa]为已有的XCode工程创建Git仓库
  3. 2023年多播ABR市场将达8亿美元
  4. python3学习第三周
  5. 第二篇:Spring Boot 热部署
  6. win11虚拟机如何安装 Windows11虚拟机安装步骤教程
  7. 软件测试主要流程分享
  8. python动漫教程视频_求python的进阶教程视频_python动漫教程视频教程
  9. windows下安装wget
  10. [Big Data - Codis, Mycat(cobar)] 企业互联网+转型实战:如何进行PB级别数据的架构变迁...
  11. 嵌入式开发语言-C语言编程
  12. C/C++ Linux 后台服务器开发高级架构师学习知识路线总结
  13. springcloud-eureka启动报错,提示The following method did not exist: org.springframework.boot.actuate.health
  14. win10修改用户名导致问题及解决
  15. 解决Warning: Incorrect string value: '\xD6\xD0\xB9\xFA\xB1\xEA...' for column 'VARIABLE_VALUE'
  16. 前端第四次培训(css笔记)
  17. 解决RTL8168网卡在ubuntu上网慢的问题
  18. 机械臂-运动轨迹(简单整理)
  19. 华中师范大学计算机学院夏令营有感
  20. 2‘13寸墨水屏时钟diy教程

热门文章

  1. 嵌入式Linux开发
  2. Ajax介绍和基本使用
  3. nginx-http-sysguard模块
  4. 专属微信公众号消息推送(java版)
  5. 这些行业已经开始用数据挖掘了,我们的前途光明
  6. html两个自然段怎么写,观后感分别每个自然段写什么
  7. LWN: VR和AR的开源方案
  8. poi操作word常用操作方法,word工具包
  9. linux websphere 端口号,Linux环境下配置websphere7.0的一些命令
  10. Android,linux常用资源下载链接