leetcode算法刷题(四)——动态规划(二)
又到了晚上,动态规划,开刷!
第121题 Best Time to Buy and Sell Stock
题目的意思:给予一个数组price,表示特定股票在某天的股价,里面第i个数表示第i天的价格。只能交易一次(买一次+卖一次),求最大利润
分析:典型的动态规划。当我们要求到第i天为止最大的利润,就需要知道i-1天为止的最大利润,然后用第i天的股价减去(i-1)天股票最低值,然后比较即可。所以我们可以推出状态转移方程:
maxProfit(i) = max(maxProfit(i-1), price[i] - min(price[:i]))
下面是代码:
class Solution:
# @param {integer[]} prices
# @return {integer}
def maxProfit(self, price):
maxprofit = 0
nextprofit = 0
profit = 0
if len(price) <= 1:
return 0
for i in range(1, len(price)):
nextprofit = max(profit, price[i] - min(price[:i]))
maxprofit = max(maxprofit, nextprofit)
profit = nextprofit
return maxprofit
可是这样提交上去,返回了一个运行超时..(未通过) 但是大体思路是正确的,所以我就想对这个程序进行改进。我注意到这几个min,max函数上。要知道,虽然我们使用了这个python提供的函数,但是python的实现过程肯定不是O(1),肯定内部实现是需要排序的,这里就和我的遍历重复了! 所以我在for循环外添加了一个变量minNum:minNum = price[0]用来记录最小值,然后在for循环中进行了如下修改:
for i in range(1, len(price)):
if price[i] < minNum:
minNum = price[i]
else:
nextprofit = max(profit, price[i] - minNum)
maxprofit = max(maxprofit, nextprofit)
profit = nextprofit
第53题 Maximum Subarray
题目的意思:求和为最大的子串,例如数组[−2,1,−3,4,−1,2,1,−5,4],它的最大子串为[4,−1,2,1],和为6
分析:如果当前和为负数,后面的数值加上当前和则必然小于原数值,则应将当前和丢弃
class Solution:
# @param {integer[]} nums
# @return {integer}
def maxSubArray(self, nums):
cursum = 0
maxsum = -2147483648
for i in range(len(nums)):
if cursum <= 0:
cursum = nums[i]
else:
cursum += nums[i]
maxsum = max(maxsum, cursum)
return maxsum
该题的变种:给一个数组,求这个数组中子序列和最大的最短子序列
比如数组a[]={1,2,2,-3,-5,5}子序列和最大为5,最短的为a[5]
分析:首先,我们可以用上面的方法求出和最大的序列和,但是这里我们可以使用一个字典来储存这个子序列。当遇到两个子序列和一样的时候,比较子序列长度,取长度小的那个。下面是代码:
def maxSum(li):
cursum = 0
maxsum = -2147483648
templist = [] #增加一个临时列表变量,用于记录子序列
shortDict = dict()
for i in range(len(li)):
if cursum > 0:
cursum += li[i]
templist.append(li[i]) #把该元素推入列表中
else:
cursum = li[i]
templist[:] = [] #此时cursum<=0,不符合条件,所以清空列表
templist.append(li[i]) #把该元素推入数组中
if maxsum > cursum:
pass
if maxsum < cursum:
maxsum = cursum
shortDict[maxsum] = templist[:]
if maxsum == cursum: #当最大和等于当前和的时候,比较二者对应子序列长度
if len(shortDict[maxsum]) > len(templist):
shortDict[maxsum] = templist[:]
return shortDict[maxsum]
在这里,有个比较有意思的点:
假设我把某列表复制给了字典某键对应的值:tempDict[key] = templist, 然后再对该列表进行操作,则这个字典的键对应的值也会发生改变!因为直接使用等号+列表名是浅复制,只是把列表的地址复制给了字典,所以对列表的任何改变都会导致dict的改变!
我需要做的就是对列表进行深复制~ 深复制的方法很简单:
方法1.
简单列表的拷贝
已知一个列表,求生成一个新的列表,列表元素是原列表的复制
a=[1,2]
b=a[:]
这样, 修改a对b没有影响。修改b对a没有影响。
方法2.
可以使用copy模块中的deepcopy函数。修改测试如下:
import copy
a=[1,2]
b=copy.deepcopy(a)
leetcode算法刷题(四)——动态规划(二)的更多相关文章
- leetcode算法刷题(五)——动态规划(三)
今天的题目不是leetcode上面的.只是觉得动态规划还是不算很熟练,就接着找了点DP的题练练 最长递增子序列的长度 题目的意思:传入一个数组,要求出它的最长递增子序列的长度.例如:如在序列1,-1, ...
- leetcode 算法刷题(一)
今天开始刷Leetcode上面的算法题.我会更新我刷题过程中提交的代码(成功和不成功的都有)和比较好的解法 第二题 Add Two Numbers 题目的意思:输入两个链表,这两个链表都是倒序的数字, ...
- leetcode算法刷题(二)——动态规划(一)
上次刷了五六道题,都是关于string处理的,这次想换个知识点刷一下,然后再回头刷string的题,当做复习.. 这几天主要会选择动态规划的题目,因为以前从没刷过这方面的东西,很多东西都不是很懂..就 ...
- leetcode算法刷题(三)
今天在刷了几道简单的动态规划后,又看了看string方面的题 第五题 Longest Palindromic Substring 题目的意思:求一个字符串的最长回文子串 分析:开始,我的想法是,现在字 ...
- Leetcode算法刷题:217和219题 Contains Duplicate
从题目名字就可以看出这两道题是相似的,219是217的加强版 217:Contains Duplicate 题目 给予一个数组,判断是否有重复的元素.如果有就返回True,没有就返回False.以下是 ...
- Leetcode算法刷题:第100题 Same Tree
Same Tree 题目 给予两棵二叉树,判断这两棵树是否相等(即各节点的值都一样) 解题思路 分别遍历两棵二叉树,并用列表分别存储这两棵树的节点的值,比较这两个列表就可以了 class Soluti ...
- Leetcode算法刷题:第14题 Longest Common Prefix
Longest Common Prefix 题目 给予一个列表,元素为字符串,写一个程序找出最长公共前缀 解题思路 先比较两个字符串,如果第一个字符不一样,则返回空值,比较完成后,用这个公共字符串和下 ...
- Leetcode算法刷题:第112题 Path Sum
Path Sum 题目 给予一个二叉树,和一个值su,寻找是否有一个从根节点到叶节点的和为su,有则返回True,没有为False.比如: 5 / \ 4 8 / / \ 11 13 4 / \ \ ...
- leetcode top-100-liked-questions刷题总结
一.起因 宅在家中,不知该做点什么.没有很好的想法,自己一直想提升技能,语言基础自不必言,数据结构还算熟悉,算法能力一般.于是乎,就去刷一通题. 刷题平台有很多,我选择了在leetcode进行刷题.回 ...
随机推荐
- js子页面获取父页面数据
做页面预览的时候,数据没有存入数据库,但是要打开一个页面进行预览,询问众大婶,原来是这样来做. 1.父页面 <input type="text" id="name& ...
- css3渐变详解
今天总结渐变的问题,渐变分为线性渐变.径向渐变.呼呼,废话少说, 线性渐变:background:linear-gradient(设置渐变形式,第一个颜色起点,中间颜色点 中间颜色的位置,结束点颜色) ...
- Memcache 在win7x64中安装配置
Memcached从0.2.0开始,要求PHP版本大于等于5.2.0. 环境:phpstudy集成环境 目标:实现php用memcache 下载:memcache for win 64 http:// ...
- php的DOMDocument 如何判断xml是否存在某节点
在做xml解释时,需要判断是否存在某个节点,查了手册函数,硬是没有发现那个函数有这个功能(如果你知道的话,请留言,博主感激涕零). 下面,就说下博主,经过N多博文,论坛查阅后,得到的一种方法(看到的博 ...
- python基础教程第5章——条件循环和其他语句
1.语句块是在条件为真(条件语句)时执行或者执行多次(循环语句)的一组语句.在代码前放置空格来缩进语句即可穿件语句块.块中的每行都应该缩进同样的量.在Phyton中冒号(:)用来标识语句块的开始,块中 ...
- SQL Server 找出值得优化的语句
方法 1. sys.dm_exec_qurey_stats 返回 SQL Server 中缓存查询计划的聚合性能统计信息. 缓存计划中的每个查询语句在该视图中对应一行, 并且行的生存期与计划本身相关联 ...
- 浏览器兼容问题汇总<转>
浏览器的内核 Mozilla Firefox ( Gecko ) Internet Explorer ( Trident ) Opera ( Presto ) Safari ( WebKit ) Go ...
- 点击页面其它地方隐藏该div的两种思路
思路一 第一种思路分两步 第一步:对document的click事件绑定事件处理程序,使其隐藏该div 第二步:对div的click事件绑定事件处理程序,阻止事件冒泡,防止其冒泡到document,而 ...
- Virtualbox下实现Ubuntu虚拟机和win7主机文件共享(很简单,亲自试用,按此步骤一般都会成功)
最近做一个操作系统实验,第一个实验即是实现Ubantu虚拟机与主机之间的共享. 本例用的是VirtualBox虚拟机,若使用Vmware WorkStation虚拟机则方法与下文介绍略有不同,但基本相 ...
- Linux基本命令(开发常用的、电脑常用的)
一.开发常用的 ###转自:http://www.weixuehao.com/archives/25#usergroup 转自:http://blog.csdn.net/ljianhui/articl ...