题意:给一个序列nums,问是否存在一个至少长度为3的上升子序列,要求时间复杂度O(n),空间复杂度O(1)。
解法:刷的第一道leetcode……medium……读题读错好多遍……真是……
时间复杂度要求的很紧……一时间没想到好方法……于是看了题解orz
大概思想就是用两个变量n1和n2,n1表示当前找到的上升子序列里最小的,n2表示找到的第2小的,当遍历到的这个数x比n1小就更新n1,否则如果比n2小就更新n2,否则就认为答案存在。
一开始没太想明白……后来明白了……n2可以认为是当前存在的长度为2的上升子序列里结尾数字最小的序列的结尾数字,如果存在比它大的答案就成立,n1认为是当前所有数中最小的,如果出现介于n1和n2之间的数时更新了n2,所以我认为n1是作为更新n2的条件存在的,只有在更新n2之前有更小的数字才可以更新,否则就保留为原来的子序列……嗯……
代码:
class Solution { public: bool increasingTriplet(vector<int>& nums) { if(nums.size() < 3) return false; int minx1 = nums[0], minx2 = INT_MAX; for(int i = 1; i < nums.size(); i++) { if(nums[i] <= minx1) minx1 = nums[i]; else if(nums[i] <= minx2) minx2 = nums[i]; else return true; } return false; } };