334. Increasing Triplet Subsequence

呜呜做过一次,但是还是记不得了。

 1 现在设置一个x,记录三个数里最小的那个,y记录中间那个,初始化x就是nums[0],y是Integer.MAX_VALUE
 2 
 3 然后从1开始往后找:
 4 
 5 1. 如果这个数比y还要大,因为这个时候x < y的,如果找到第三个比y还大的,那么就返回true
 6 
 7 2. 如果这个数没有比y大,还有两种情况:
 8 
 9   1)比x还要小(或者等于x),就把x更新到当前位置,但是y不动,x是potentially下一组的最小数,y此刻仍然表示,第二个数,如果下一组找到了比y还大的,仍旧可以返回true。
10 
11   2)没有比x小,也就是介于现在的x与y之间,那么就更新y,x不变,表示曾经的一组xy失效了。为什么这样一定能找到呢,因为此刻的x已经是先更新过的了(因为在2.1中先更新了x),小于原本的x,y是小于原本的y(因为条件2说明了这一点),所以这是更小的一组xy,更可能成功。
12 
13 如果结束了整个数组的遍历都没有找到答案,那就返回false

大概就是这样。希望能够记住!!

 1     public boolean increasingTriplet(int[] nums) {
 2         if(nums.length < 3) {
 3             return false;
 4         }
 5         int x = nums[0];
 6         int y = Integer.MAX_VALUE;
 7         for(int i = 1; i < nums.length; i++) {
 8             if(nums[i] > y) {
 9                 return true;
10             } else {
11                 if(nums[i] <= x) {
12                     x = nums[i];
13                 } else {
14                     y = nums[i];
15                 }
16             }
17         }
18         return false;
19     }

时间复杂度是O(n)

posted @ 2016-08-04 03:27  warmland  阅读(380)  评论(0编辑  收藏  举报