leetcode算法刷题(五)——动态规划(三)
今天的题目不是leetcode上面的。只是觉得动态规划还是不算很熟练,就接着找了点DP的题练练
最长递增子序列的长度
题目的意思:传入一个数组,要求出它的最长递增子序列的长度。例如:如在序列1,-1,2,-3,4,-5,6,-7中,最长递增序列为1,2,4,6,所以长度为4。
分析:这道题我们可以用动态规划来做。对于数组的前i个元素,记L(i)为前i个最长递增子序列的长度。我们可以得到状态转移方程:L(i) = max(L(j))+1, 其中j<i, a[j]<a[i]
. 这个解法比较容易想出来。可是这个解法的时间复杂度有点高(O(n^2))。下面是另一种解法,利用了二分查找(O(logn)),时间复杂度是O(nlogn)
def maxlong(li):
maxLong = [0 for i in range(len(li))]
maxLong[0] = li[0]
leng = 1
for i in range(1,len(li)):
if li[i] > maxLong[leng-1]:
maxLong[leng] = li[i]
leng += 1
else:
pos = biSearch(li[i], leng, maxLong)
maxLong[pos] = li[i]
return leng
def biSearch(value, length, maxLong):
left = 0
right = length-1
while left <= right:
mid = (left+right)//2
if maxLong[mid] > value:
right = mid-1
elif maxLong[mid] < value:
left = mid+1
else:
return mid
return left
从左往右递增再递减的数列
题目的意思:从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的。
分析:这道题是上面那道题的变体。我们可以把这道题这样看:
筛除数字后,数组的0~i位是递增数列,数组的(len(li)-1)~i位是递增数列。
其实这道题等效于求出这两个数列的递增数列长度(a[i],b[i]),再求出min(len(li)-a[i]-b[i]+1)
该方法利用了前一道题求最长递增子序列长度的方法。
def maxlong(li):
maxLong = [0 for i in range(len(li))]
maxLong[0] = li[0]
leng = 1
for i in range(1,len(li)):
if li[i] > maxLong[leng-1]:
maxLong[leng] = li[i]
leng += 1
else:
pos = biSearch(maxLong, leng, li[i])
maxLong[pos] = li[i]
return leng
def biSearch(li, length, value):
left = 0
right = length-1
while left <= right:
mid = (right + left)//2
if li[mid] > value:
right = mid -1
elif li[mid] < value:
left = mid + 1
else:
return mid
return left
def mindelete(li):
a = [0 for i in range(len(li))]
b = [0 for i in range(len(li))]
c = 0
for i in range(len(li)):
li_a = li[:i+1]
a[i] = maxlong(li_a)
li_b = li[:i:-1]+[li[i]]
b[i] = maxlong(li_b)
for i in range(len(li)):
c = max(c, a[i]+b[i])
return len(li) -c +1
leetcode算法刷题(五)——动态规划(三)的更多相关文章
- leetcode算法刷题(二)——动态规划(一)
上次刷了五六道题,都是关于string处理的,这次想换个知识点刷一下,然后再回头刷string的题,当做复习.. 这几天主要会选择动态规划的题目,因为以前从没刷过这方面的东西,很多东西都不是很懂..就 ...
- leetcode算法刷题(四)——动态规划(二)
又到了晚上,动态规划,开刷! 第121题 Best Time to Buy and Sell Stock 题目的意思:给予一个数组price,表示特定股票在某天的股价,里面第i个数表示第i天的价格.只 ...
- leetcode 算法刷题(一)
今天开始刷Leetcode上面的算法题.我会更新我刷题过程中提交的代码(成功和不成功的都有)和比较好的解法 第二题 Add Two Numbers 题目的意思:输入两个链表,这两个链表都是倒序的数字, ...
- 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进行刷题.回 ...
随机推荐
- linux学习笔记之文件类型,及目录介绍
引用A:http://www.cnblogs.com/xiaoluo501395377/archive/2013/04/20/3033131.html 引用B:http://www.cnblogs.c ...
- mysql 的replace 和replace in to
1. mysql 的replace 批量替换 update candidate set education = replace(education,'科','学') where education ...
- spring:ContextLoaderListener接口
在启动Web容器时,自动装配Spring applicationContext.xml的配置信息. 因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启 ...
- Android 底部Dialog显示
public void showComplainDialog() { ComplainDialog complain_dialog = new ComplainDialog(OrderDetialAc ...
- Oracle EBS-SQL (QA-1):检查超出检验周期的检验数据.sql
select msi.segment1 物料编码, msi.DESCRIPTION ...
- JavaScript实现私有属性
原文:JavaScript实现私有属性 JavaScript被很多人认为并不是一种面向对象语言,原因有很多种,比如JavaScript没有类,不能提供传统的类式继承:再比如JavaScript不能实现 ...
- 多级列表——ExpandableListView
ExpandableListView控件提供的是一个多级列表(一般是两级),我们先来看一下效果图,如图4.18所示为头部列表,单击其中的每一项下面会显示第二级列表,如图4.19所示. 从图4.18和图 ...
- Lipschitz连续【zz】
转载地址:http://moosewoler.blog.163.com/blog/static/6986605201242643122296/ 李普希兹连续是以德国数学家Rudolf Lipschit ...
- CDOJ 631 敢说敢做 记忆化搜索and动规
//跟沈爷学的 传送门http://www.cnblogs.com/Xiper/p/4639636.html #include<cstdio> #include<iostream&g ...
- linux脚本之简单实例
利用脚本计算10的阶乘 简单说明一下: #!/bin/bash说明该shell使用的bash shell程序.这一句不可少for i in `seq 1 10`还可以写成for i in 1 2 3 ...