一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 1444|回复: 7
收起左侧

[数组] Leetcode 334 Increasing Triplet Subsequence

[复制链接] |试试Instant~ |关注本帖
coolguy 发表于 2016-2-16 13:20:33 | 显示全部楼层 |阅读模式

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
想了好久的O(1) space的方法。贴出来,请斧正。
  1.         public boolean increasingTriplet(int[] nums) {
  2.             if (nums == null || nums.length <= 0) return false;
  3.             int n = nums.length;
  4.             if (n < 3) return false;

  5.             int lmin = nums[0];
  6.             int middle = nums[0];
  7.             boolean sawOnce = false;
  8.             for (int i = 1; i < n; i++) {
  9.                 if (nums[i] <= lmin) {
  10.                     lmin = nums[i];
  11.                 } else if (!sawOnce || nums[i] <= middle) {
  12.                     middle = nums[i];
  13.                     sawOnce = true;
  14.                 } else {
  15.                     return true;
  16.                 }
  17.             }

  18.             return false;
  19.         }
复制代码
stellari 发表于 2016-2-20 11:43:14 | 显示全部楼层
JamesJi 发表于 2016-2-19 23:04
s大对于扩展到k个有什么思路吗

这题的解法实质上是维护了2个DP队列:one和two。one[ i ]是“在 i 或之前 最小的数字”,two[ i ]是“在 i 或之前第2个数字最小的2-sequence中的第2个数字”。

处理nums[ i ]时,检查
1、nums[ i ]是否比two[ i - 1 ]大,如果是的话,说明能形成一个3-sequence,返回true;否则检查:
2、nums [ i ]是否比one [ i - 1]大,如果是的话,说明能形成一个更小的2-sequence(因为由1已经知道nums[ i ] 一定不会比two[i - 1]更差),于是更新two[ i ]。然后无论结果如何,都:
3、更新one [ i ]

因为每次都只用到上一次的one和two,所以one和two只要分别用一个变量表示就好。

LZ的代码其实也是类似的意思,只是用sawOnce和middle二变量合起来行使了two[ i ]的功能。

------------

推广到k-sequence,只要按把上述的2个DP队列增加到k-1个即可。上面的第2步写成一个k-2步的循环即可,其他都不变。
回复 支持 2 反对 0

使用道具 举报

stellari 发表于 2016-2-16 17:21:20 | 显示全部楼层
第4行可以合并到第2行上去吧。其他的内容大家的方法应该都差不多。

不过,如果这道题改成在nums中找increasing k-subsequence,你打算怎么扩展呢?
回复 支持 1 反对 0

使用道具 举报

wwk55551111 发表于 2016-2-16 23:09:15 | 显示全部楼层
O(1) space的方法?
冒泡排序可以么....
回复 支持 反对

使用道具 举报

stellari 发表于 2016-2-16 23:24:12 | 显示全部楼层
wwk55551111 发表于 2016-2-16 23:09
O(1) space的方法?
冒泡排序可以么....

还要O(N)时间……
回复 支持 反对

使用道具 举报

pop088 发表于 2016-2-17 07:00:11 | 显示全部楼层
顺手写了一个python的,将就看看吧

  1.         if len(nums)<3:
  2.             return False

  3.         limit=sys.maxint
  4.         mins=nums[0]
  5.         i=1
  6.         while i<len(nums):
  7.             if nums[i]>limit:
  8.                 return True
  9.             if nums[i]>mins:
  10.                 limit=min(nums[i],limit)
  11.             mins=min(mins,nums[i])
  12.             i+=1
  13.         
  14.         return False
复制代码
回复 支持 反对

使用道具 举报

yyyusa 发表于 2016-2-19 13:20:53 | 显示全部楼层
这是哪个公司的?
回复 支持 反对

使用道具 举报

JamesJi 发表于 2016-2-19 23:04:16 | 显示全部楼层
stellari 发表于 2016-2-16 04:21
第4行可以合并到第2行上去吧。其他的内容大家的方法应该都差不多。

不过,如果这道题改成在nums中找incr ...

s大对于扩展到k个有什么思路吗
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-5 23:42

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表