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)