python买卖股票的最佳时机--贪心/蛮力算法简介
开始刷leetcode算法题 今天做的是“买卖股票的最佳时机”
题目要求
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
看到这个题目 最初的想法是蛮力法
通过两层循环 不断计算不同天之间的利润及利润和
下面上代码
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
""" self.allbuy1 = [] #单次买卖的差值数组 (可能为负)
self.allbuy2 = [] #所有可能买卖的利润数组 (可能为负)
# allbuy1和allbuy2的区别为一个是单次买卖 一个是多次买卖和
self.curbuy(prices,0,0) #prices 为价格表 0:初始 0:
#print(self.allbuy1)
#print(self.allbuy2)
return self.picBigest(self.allbuy2)
def buyticket(self,prilist,a,b): #list:放入的价格数组 a:上一次买入的价格 b:今天卖出的价格
return prilist[b] -prilist[a] #返回 赚取得价格 def curbuy(self,plist,x,result): #plist:价格数组 x:当天的数组坐标 result: 利润
obj=result #固定上一次的价格 保存为上一个递归
lens=len(plist) #天数
for i in range(x,lens-1):
for j in range(i+1,lens):
temp=self.buyticket(plist,i, j)
self.allbuy1.append(temp)
self.allbuy2.append(temp) #单次利润放入数组
result = obj + temp #将之前的利润加上今天的利润
if(x>=2): #如果买入是第2+1天以后 则可以加上之前的利润
self.allbuy2.append(result) #多次买卖利润放入数组
self.curbuy(plist,j+1,result) #递归 j+1:卖出的后一天 result:利润 def picBigest(self,reslist):
big=0
for i in reslist:
if (i>big):
big=i
print(big)
return big if __name__ == '__main__':
test=Solution()
prices = [5,7,3,8] # 输入的每日股票数组
test.maxProfit(prices)
分析:
这个代码理解起来简单 就是将所有可能都放入数组中 找出最大一个可能
将这个代码提交时 显示 超出时间限制 确实 如果输入的数组长度非常大时 计算量巨大 出现错误
——————————————————————————————————————————————————————————————————————————————
更换思路:利用贪心算法解决此事
首先介绍 一下贪心算法: 对问题只对当前情况进行最优解处理,之后发生什么对之前的决定都不改变。简单的说就是一个局部最优解的过程
介绍个例子就明白了: 找零钱问题
假设有面值为5元、2元、1元、5角、2角、1角的货币,需要找给顾客4元6角现金,为使付出的货币的数量最少
首先找出小于4元6角的最大面值(2元)
其次找出小于2元6角的最大面值(2元)
接着找出小于6角的最大面值(5角)
最后找出小于1角的最大面值(1角) ---付出4张纸币
介绍完了贪心算法简单思想 就利用该方法解决对应问题
在已知股票价格走势情况下 只需要对下一天进行判断 如果涨了 则买 如果跌了则卖 这样收益会保持固定增长
当然了 有人会提出 我可以选择不卖等几天再卖 或不买等几天再买 的方式 一样可以保持增长 但是如图

如果在第2天买入 3天卖出 4天买入 5天卖出 收益为A+B
如果在第2天买入 5天卖出 收益为 C
明显得出A+B大于C 所以贪心法在这种情况非常适用并且肯定得到最优解
直接上代码
class Solution(object):
def maxProfit(self, prices):
profit = 0
for day in range(len(prices)-1):
differ = prices[day+1] - prices[day]
if differ > 0:
profit += differ
return profit
if __name__ == '__main__':
test=Solution()
prices = [5,7,3,9] # 输入的每日股票数组
print(test.maxProfit(prices))
python买卖股票的最佳时机--贪心/蛮力算法简介的更多相关文章
- 算法练习之杨辉三角,杨辉三角的第 k 行,买卖股票的最佳时机
1. 杨辉三角 给定一个非负整数 numRows,生成杨辉三角的前 numRows 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例: 输入: 输出: [ [], [,], [,,], [ ...
- LeetCode初级算法之数组:122 买卖股票的最佳时机 II
买卖股票的最佳时机 II 题目地址:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/ 给定一个数组,它的第 i ...
- lintcode:买卖股票的最佳时机 II
买卖股票的最佳时机 II 假设有一个数组,它的第i个元素是一个给定的股票在第i天的价格.设计一个算法来找到最大的利润.你可以完成尽可能多的交易(多次买卖股票).然而,你不能同时参与多个交易(你必须在再 ...
- lintcode:买卖股票的最佳时机 I
买卖股票的最佳时机 假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格.如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润. 样例 给出一个数组样例 [3,2,3 ...
- Leecode刷题之旅-C语言/python-121买卖股票的最佳时机
/* * @lc app=leetcode.cn id=121 lang=c * * [121] 买卖股票的最佳时机 * * https://leetcode-cn.com/problems/best ...
- leecode刷题(2)-- 买卖股票的最佳时机
买卖股票的最佳时机 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多 ...
- Leetcode之动态规划(DP)专题-188. 买卖股票的最佳时机 IV(Best Time to Buy and Sell Stock IV)
Leetcode之动态规划(DP)专题-188. 买卖股票的最佳时机 IV(Best Time to Buy and Sell Stock IV) 股票问题: 121. 买卖股票的最佳时机 122. ...
- Java实现 LeetCode 188 买卖股票的最佳时机 IV
188. 买卖股票的最佳时机 IV 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 k 笔交易. 注意: 你不能同时参与多 ...
- 刷题-力扣-122. 买卖股票的最佳时机 II
122. 买卖股票的最佳时机 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell ...
随机推荐
- Django的rest_framework的视图之基于通用类编写视图源码解析
我们上一篇博客讲解了如何使用mixins类实现rest_framework的视图,但是其中有很多的冗余的代码,我们这边在来优化一下 1.queryset的视图函数 首先看下对queryset操作的视图 ...
- 互联网公司的面试官是如何360°无死角考察候选人的?[z]
[z]https://juejin.im/post/5c0e47ebf265da614e2be9a7 一.写在前面 最近收到不少读者反馈,说自己在应聘一些中大型互联网公司的Java工程师岗位时遇到了不 ...
- 利用Sharding-Jdbc实现分表[z]
[z]https://www.cnblogs.com/codestory/p/5591651.html 你们团队使用SpringMVC+Spring+JPA框架,快速开发了一个NB的系统,上线后客户订 ...
- django 在centos 7 下 指定ip地址和端口 报错问题
windows environment: python manage.py runserver host:port centos environment: python manage.py runse ...
- c#子线程线程中操作窗体更新的报错
用 在执行上传时,由于操作较长窗体界面卡住,于是用task解决 Task t1 = new Task(manage.UploadData); t1.Start(); 结果不卡了,程序也传完了,运行到更 ...
- How Xtuner E3 works for BMW 520d Diagnosis and initialization of CBS service
Using Xtuner E3 to perform BMW 520d Diagnosis and initialization of CBS service in step by step proc ...
- c++ stl源码剖析学习笔记(一)uninitialized_copy()函数
template <class InputIterator, class ForwardIterator>inline ForwardIterator uninitialized_copy ...
- python 的面相对象编程--对应c++
在python的面相对象编程中,我们常常在class中可以看到a(), _b() , __c(), __d()__这样的函数. 由于我是看廖雪峰老师的教程,廖老师为了简单起见,没有引入太多概念,我 ...
- 《C#从现象到本质》读书笔记(三)第3章C#类型基础(下)
<C#从现象到本质>读书笔记第3章C#类型基础(下) 常量以关键字const修饰.C#支持静态字段(类型字段)和实例字段. 无参属性的get方法不支持参数,而有参属性的get方法支持传入一 ...
- Apache ab性能测试结果分析
Apache ab性能测试结果分析 测试场景:模拟10个用户,对某页发起总共100次请求. 测试命令: ab -n 100 -c 10 地址 测试报告: Server Software: 被测服务器软 ...