1. 解析
题目大意,求解子序列是否存在一个长度为3的递增子序列。
2. 分析
涉及子序列问题,一般都是动态规划。与Longest Increasing Subsequence最大的不同在于,只要求长度为3即可,思路是一样的。subsequence[i]表示[0, i]内递增子序列的最大长度,每次向后检索,然后更新当前的最大长度即可,前面依赖的状态之前已经求解过,不过题目要求O(1)的空间复杂度,所以这种解题思路不是正确的。
class Solution {
public:
bool increasingTriplet(vector<int>& nums) {
vector<int> subsequence(nums.size(), 1);
int res = 0;
for (int i = 0; i < nums.size(); ++i){
for (int j = i - 1; j >= 0; j--){
if (nums[i] > nums[j] && subsequence[i] < subsequence[j] + 1){ //更新当前的状态
subsequence[i] = subsequence[j] + 1;
}
}
res = max(res, subsequence[i]);
if (res >= 3) return true;
}
return false;
}
};
3. 核心解法
参考@Grandyang的解法,思路很巧妙,即建立两个指针,left指向当前最小的数,right指向比left略微大的数,所以我们的目标就是检测是否存在大于right指针的数,left始终更新的是最小值,right更新的是稍微比left大一点的数。
例如:5 4 9 3 2 11
left = 5——> 4——>3——>2
right = 9
11 return true
class Solution {
public:
bool increasingTriplet(vector<int>& nums){
int left = INT_MAX, right = INT_MAX;
for (int num : nums){
if (left >= num) left = num; //更新left,使其始终指向最小的值
else if (right >= num) right = num; //更新right,使其始终指向比left大的最小值
else return true;
}
return false;
}
};
4. 类似的题目
Longest Increasing Subsequence