这也是和121. 买卖股票的最佳时机的唯一区别(注意只有一只股票,所以再次购买前要出售掉之前的股票)
题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iv/
令 为第 只股票之前(包含)买卖 次(且最后一次操作为买入)可以获得的最大利润, 为第 只股票之前(包含)买卖 次(且最后一次操作为卖出)可以获得的最大利润。
股票买卖这一类的问题,都是给一个输入数组,里面的每个元素表示的是每天的股价,并且你只能持有一支股票(也就是你必须在再次购买前出售掉之前的股票),一般来说有下面几种问法:
动态规划,英文:Dynamic Programming,简称DP,将问题分解为互相重叠的子问题,通过反复求解子问题来解决原问题就是动态规划,如果某一问题有很多重叠子问题,使用动态规划来解是比较有效的。
上篇文章 LeetCode 股票问题的一种通用解法 用递归的方法实现了一套简单易懂的可行解,但是时间复杂度略高,不能通过全部测试用例。
给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。
在[LeetCode]买卖股票的最佳时机ⅠⅡ中,Jungle采用波峰波谷法解决了两道简单题。那么剩余4到题目该如何求解呢?
309. 最佳买卖股票时机含冷冻期 给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。 设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 示例 1: 输入:k = 2, prices = [2,4,1] 输出:2 解释:在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2 。
为什么需要做算法题?大家其实都有发现在这一段2020年开始,各大公司对于前端的面试中,都不同程度的加入了算法题的测试,其中让大家最有感悟的就是字节跳动的前端面试,加入了大量的算法考验,其中不乏有很多在LeetCode上的中等以及困难题目,我也在知乎上发起了一个提问。浏览量上百万,也得到了很多的评论。
dp初始化: dp[-1][k][0] = dp[i][0][0] = 0 dp[-1][k][1] = dp[i][0][1] = -infinity
相对于之前的股票问题,去除了手续费和冷冻期,其他大部分相同, 但是交易的次数从一次可以变为两次(最多为两次,也可以选择一次或者零次)
题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii/
题目:一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。 在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。
本文作为补充文章,对更复杂的题目进行解答,如果还没有阅读上篇文章,希望小伙伴们先去看一下上篇文章:详解股票买卖算法的最优解(一),有助于理解。
给定一个数组 prices ,它的第 i 个元素 pricesi 表示一支给定股票第 i 天的价格。
动态规划虽然说有一定难度,主要是找到状态转移的公式,但是也依然是有些规律可以找寻的。
最近梳理高频动态规划问题,股票问题当然是非常经典的动态规划问题,并且整个系列有好几道题,这里我整理了6道股票系列的经典问题分享给大家,咱们今天聊聊买卖股票的最佳时机。
题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/
本题中买卖次数变成了最多两次,那么我们可以照搬之前只能买卖一次的做法。首先如果我们假设第一只股票卖出去时价格是 ,那么它之前的最优买入价格(也就是最低的价格)计算方法和第一题相同,只需要用一个变量存储就行了。而第二次买卖我们只需要知道 右边进行一次买卖最多能赚到多少钱就行了。这可以通过从右向左倒过来预处理处理,方法和第一题完全相同。
主要用的技巧是“状态机”,那么什么是“状态机”呢?没听过的小伙伴会觉得它很高大尚,但今天我们讨论过后,你会发现其实它就是那么回事。
某个男人 动态规划,而我作为一个致力称为厨师界最会写算法的前端,总得刷上一部分题,有那么一点发现吧,现在我们就来聊聊,菜鸡如我,发现了什么。
从去年7月到现在,我已经在北京的互联网公司呆了整整一年的时间。这中间经历过各种各样的酸甜苦辣,自己为了面试刷题的过程(从杉数到滴滴——未入门算法工程师再找实习工作记),也会经常听到北美同学面试的时候所遇到的各种艰难。是的,只要是互联网公司,无论是国内还是国外,总是要考察很多leetcode的东西。而leetcode如何刷,刷多少,刷到什么程度,其实各个公司也各不相同。但是事实上,leetcode的本质考察点是算法与数据结构,而除去基本的算法与数据结构外,leetcode困难的地方在于熟练度+一些技巧。然而技巧毕竟是存量,不是增量,我们刷多了,自然就有经验。所以这一个系列,我们不面向easy的题目,而更多关注hard和medium+的高频题,并通过大量的leetcode原题,来刻画出互联网公司究竟会考察哪些实际算法与数据结构的知识,以达到复习《算法与数据结构》的效果。
输入: [2,4,1], k = 2 输出: 2 解释: 在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2 。
很多读者抱怨 LeetCode 的股票系列问题奇技淫巧太多,如果面试真的遇到这类问题,基本不会想到那些巧妙的办法,怎么办?所以本文拒绝奇技淫巧,而是稳扎稳打,只用一种通用方法解决所用问题,以不变应万变。
动态规划我能总结出动规五部曲,二叉树我们总结出递归三部曲,回溯算法我也能总结出回溯三部曲。
给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。 注意你不能在买入股票前卖出股票。
2020年元旦后,股市小涨了一波,Jungle趁此机会,开始思考LeetCode上的股票买卖时机的问题。
如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。
先来解释什么是“状态”( State )。现实事物是有不同状态的,例如水,就有固液气三种状态。我们通常所说的状态机是有限状态机,也就是说被描述的事物的状态是有限的,水的状态就是三个——固液气。
力扣题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/)
题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/
力扣题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii
题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/
题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/
这道题,我们还是用我们上次讲到【day18】的动态规划法来解决吧。这一道题和上一道题的区别,在于k值,上一道的k为1,这一次的k不限次数。
假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益
之前介绍了【LeetCode 买卖股票的最佳时机】系列一共六道题目,这里把之前的题解还有题目链接汇总一下,方便大家查找。
算法一直是大厂前端面试常问的一块,而大家往往准备这方面的面试都是通过leetcode刷题。
领取专属 10元无门槛券
手把手带您无忧上云