1、写在前面面试
为何要在LeetCode刷题?你们都知道不论是校招仍是社招算法题是必考题,而这一部分恰巧是大多数人的短板,因此刷题首先是为了提升自身的编程能力,可以在算法面试中脱颖而出,拿到满意的offer。本身是打算考研的,计算机考研数据结构也是必考题,因此刷题的第二个缘由就是为了巩固本身的数据结构知识。算法
应该如何刷题呢?这两个月本身是顺序刷题的,可是总结的时候发现知识点太零散,前二十题有栈,链表,数组等等,本身总结的时候没有造成一个完整的体系,也没有清晰的分类,这不是本身想要的,因此本身后期刷题将采用专题的方式,好比数组,链表,二叉树等等。编程
那么第一个专题就是贪心算法。前20题连接【LeetCode】汇总贴(NO.1-20)数组
本身建了一个LeetCode刷题群,交流本身的刷题心得,如今尚未到达预约的人数,感兴趣的小伙伴能够参加哦,我的微信:wxb950917。微信
为面试而生,期待你的加入。
2、什么是贪心算法数据结构
贪心算法在LeetCode共有41个题目,以中等难度居多。那么什么是贪心算法呢?机器学习
贪心算法(又称贪婪算法)是指,在对问题求解时,老是作出在当前看来是最好的选择。也就是说,不从总体最优上加以考虑,他所作出的是在某种意义上的局部最优解。学习
贪心算法每一步必须知足一下条件:设计
一、可行的:即它必须知足问题的约束。3d
二、局部最优:他是当前步骤中全部可行选择中最佳的局部选择。
三、不可取消:即选择一旦作出,在算法的后面步骤就不可改变了。
学习贪心算法的时候能够结合动态规划一块儿来学习,二者仍是很类似的。
3、今日题目
买卖股票的最佳时机 II(122)
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你能够尽量地完成更多的交易(屡次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉以前的股票)。
示例 1:
输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能得到利润 = 5-1 = 4 。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能得到利润 = 6-3 = 3 。
示例 2:
输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能得到利润 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接连购买股票,以后再将它们卖出。 由于这样属于同时参与了多笔交易,你必须在再次购买前出售掉以前的股票。
示例 3:
输入: [7,6,4,3,1]
输出: 0
解释: 在这种状况下, 没有交易完成, 因此最大利润为 0。
4、题目分析
贪心算法,老是作出在当前看来是最好的选择,不从总体最优上加以考虑,也就是说,只关心当前最优解,按照贪心策略,不关心之后,咱们只关心当前利益。第0天买入,花费prices[0],第一天卖出,获得prices[1],那么咱们的收获就是profit = prices[1] - prices[0],那么有两种状况
(1)当profit > 0 时,赶忙买入卖出,能赚一笔是一笔。
(2)当profit <= 0 时,再买入卖出的话,那就是傻了,亏钱。
以此方式类推下去,即得最大利润。
5、代码实现
class Solution:
def maxProfit(self, prices): """ :type prices: List[int] :rtype: int """ profit = 0 temp=0 for i in range(1,len(prices)): temp=prices[i] - prices[i-1] if temp>0: profit+=temp return profit
【推荐阅读】