专栏名称: 九章算法
专业的北美IT求职经验分享、技术交流社区,帮助你找到好的IT工作。由硅谷顶尖IT企业工程师维护。提供专业的算法培训/面试咨询,官网 www.jiuzhang.com
目录
相关文章推荐
九章算法  ·  升到L6,谈谈今年的情况 ·  昨天  
九章算法  ·  最后一天!九章消费券免费抢! ·  3 天前  
九章算法  ·  疯狂给码农“砸钱”的公司!Top3完爆大厂! ·  4 天前  
51好读  ›  专栏  ›  九章算法

谷歌面试题 | 最长递增子序列

九章算法  · 公众号  · 算法  · 2017-10-24 07:04

正文


作者 | 陈近南

编辑 | Levene

专栏 | 九章算法


题目描述


给一列没有经过排序的数,计算最长的递增序列有几个


样例


输入 :[1,3,5,4,7]

输出 : 2

说明 : 可见上升的最长序列有这么两个,[1, 3, 4, 7] 和 [1, 3, 5, 7]


输入 :[2,2,2,2,2]

输出 : 5

说明 : 最长的长度为 1 ,有5个情况,每个都是2


解题思路分析


Ⅰ. 首先解决最长的递增序列问题,最朴素的做法是 深搜 ,以每一个数为开头,找位置在它后面的且数值比它大的为下一层,显然会超时,考虑用 动态规划 去解决问题(也就是最长上升序列(LIS),一个经典的动态规划问题)


Ⅱ. 设dp[i]为以该数结尾,能构成的最长序列的 长度 。进行连接的时候,对于每个数字num[i],遍历位置在它之前的数字num[j],如果比这个数小(num[j]


Ⅲ. 考虑完题目的长度优先后,我们考虑 数量 ,也就是说最长长度的序列有几个,这个问题需要我们在处理dp的时候来记录,我们设ans[i]为以第i个数结尾的最长序列的个数,与dp同理,ans初值也都是1


Ⅳ. 状态转移的时候,如果dp更新了,也就是说(dp[j]+1>dp[i])说明这个长度的序列是新出现的,我们需要将ans[i]设置为ans[j],因为新序列中,最新的数提供了序列的尾巴,数量是由前面积累的(或者说转移);举例序列[1 1 3 7]我们易得数字3对应的dp=2,ans=2,因为可以构成两个[1 3]那么我们操作到数字7的时候,发现接在3后面最长,就可以转移ans来作为初始数量


Ⅴ. 而当dp[j]+1==dp[i]的时候,如同样例,操作7的时候,我们最先发现了可以接在5后面,最长序列[1 3 5 7],然后发现可以接在4后面,[1 3 4 7],长度也是4,这时候就同样需要转移ans,加上去 ans[i]+=ans[j]


Ⅵ. 最后我们需要遍历dp,找到dp[i]=我们记录的最大值的时候,累加我们得到的ans[i],即为所求结果,时间复杂度是O(n^2)


参考程序


http://www.jiuzhang.com/solution/number-of-longest-increasing-subsequence/



面试官角度分析


本题是一道经典动态规划问题(最长上升子序列)的扩展,难度中等偏简单,给出动态规划算法以及统计次数的方法就可以达到hire


lintcode相关问题


http://www.lintcode.com/zh-cn/problem/longest-increasing-subsequence/


更多精彩内容
  • 回复“简历”,查看简历撰写指南,获取“简历模板”

  • 回复“冷冻期”,查看北美各大IT企业冷冻期信息和注意事项

  • 回复“Career”, 查看Caireer Fair 攻略 check list

  • 回复“薪资”,查看北美各大IT企业New Grades Engineer 薪资水平;

  • 回复“项目”,查看7-14天可以搞定的小项目推荐







请到「今天看啥」查看全文