leetcode 121. 买卖股票的最佳时机 (贪心 + 动规 + 双指针
贪心的思路:
得到最小值,再挨个用数组中的值减去最小值,最终值取一个最大的
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. 买卖股票的最佳时机 (贪心 + 动规 + 双指针相关推荐
- LeetCode #121 买卖股票的最佳时机 贪心 单调栈 动态规划
LeetCode #121 买卖股票的最佳时机 题目描述 给定一个数组,它的第 iii 个元素是一支给定股票第 iii 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算 ...
- 158. Leetcode 121. 买卖股票的最佳时机 (贪心算法-股票题目)
class Solution:def maxProfit(self, prices: List[int]) -> int:low, max_profit = float("inf&qu ...
- leetcode - 121.买卖股票的最佳时机
121.买卖股票的最佳时机 ------------------------------------------ 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成 ...
- LeetCode - 121. 买卖股票的最佳时机
121. 买卖股票的最佳时机 class Solution {public int maxProfit(int[] prices) {if (prices == null || prices.leng ...
- LeetCode 121:买卖股票的最佳时机 思考分析
题目描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润. 注意:你不能在买入股票 ...
- leetcode.121. 买卖股票的最佳时机(best-time-to-buy-and-sell-stock)
文章目录 121. 买卖股票的最佳时机 代码与思路 暴力法 一次遍历 单调栈 122. 买卖股票的最佳时机 II 代码与思路 股票问题系列通解 121. 买卖股票的最佳时机 给定一个数组,它的第 i ...
- 105. Leetcode 121. 买卖股票的最佳时机 (动态规划-股票交易)
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格. 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票.设计一个算法来 ...
- LeetCode: 121. 买卖股票的最佳时机(C++)
题目: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票 ...
- LeetCode 121. 买卖股票的最佳时机(Best Time to Buy and Sell Stock)
简单粗暴的第一种解法: class Solution { public:int maxProfit(vector<int>& prices) {int m = prices.siz ...
最新文章
- php ajax formdata 进度,使用formdata使用ajax将数据发送到PHP
- [Cocoa]为已有的XCode工程创建Git仓库
- 2023年多播ABR市场将达8亿美元
- python3学习第三周
- 第二篇:Spring Boot 热部署
- win11虚拟机如何安装 Windows11虚拟机安装步骤教程
- 软件测试主要流程分享
- python动漫教程视频_求python的进阶教程视频_python动漫教程视频教程
- windows下安装wget
- [Big Data - Codis, Mycat(cobar)] 企业互联网+转型实战:如何进行PB级别数据的架构变迁...
- 嵌入式开发语言-C语言编程
- C/C++ Linux 后台服务器开发高级架构师学习知识路线总结
- springcloud-eureka启动报错,提示The following method did not exist: org.springframework.boot.actuate.health
- win10修改用户名导致问题及解决
- 解决Warning: Incorrect string value: '\xD6\xD0\xB9\xFA\xB1\xEA...' for column 'VARIABLE_VALUE'
- 前端第四次培训(css笔记)
- 解决RTL8168网卡在ubuntu上网慢的问题
- 机械臂-运动轨迹(简单整理)
- 华中师范大学计算机学院夏令营有感
- 2‘13寸墨水屏时钟diy教程