0
点赞
收藏
分享

微信扫一扫

334. 递增的三元子序列

上善若水的道 2022-04-14 阅读 38

给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列。

如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true ;否则,返回 false 。

示例 1:

输入:nums = [1,2,3,4,5]
输出:true
解释:任何 i < j < k 的三元组都满足题意
示例 2:

输入:nums = [5,4,3,2,1]
输出:false
解释:不存在满足题意的三元组
示例 3:

输入:nums = [2,1,5,0,4,6]
输出:true
解释:三元组 (3, 4, 5) 满足题意,因为 nums[3] == 0 < nums[4] == 4 < nums[5] == 6
 

提示:

1 <= nums.length <= 5 * 105
-231 <= nums[i] <= 231 - 1
 

进阶:你能实现时间复杂度为 O(n) ,空间复杂度为 O(1) 的解决方案吗?

class Solution {
public:
bool increasingTriplet(vector<int>& nums) {
int n=nums.size();
vector<int>temp(n,0);
stack<int>s;
for(int i=n-1;i>=0;i--)
{
while(!s.empty()&&nums[s.top()]<=nums[i])
s.pop();
if(!s.empty())
temp[i]=s.top();
else
temp[i]=-1;
s.push(i);
}

for(int i=0;i<n;i++)
{
cout<<temp[i]<<endl;
}

for(int i=0;i<n;i++)
{
if(temp[i]!=-1)
{
cout<<"temp["<<i<<"]!=-1"<<endl;
if(temp[temp[i]]!=-1)
return 1;
}
}
return 0;
}
};

以上代码是错误的。用了单调栈,想找到每个数后面第一个比他大的数的下标,没有就记为-1  。这样做的问题是:

[1,5,0,4,1,3]

可以看到[0,1,3]满足条件,但是算法会return 0 。因为0后面第一个比他大的是4,4后面没有,所以不能这样做。

正确做法的思路:C++ 线性时间复杂度详细解析,打败 98% - 递增的三元子序列 - 力扣(LeetCode) (leetcode-cn.com)非常巧妙,用双指针完成了解题过程。

代码:

class Solution {
public:
bool increasingTriplet(vector<int>& nums) {
int n=nums.size();
int small=INT_MAX;
int mid=INT_MAX;
for(int i=0;i<n;i++)
{
if(nums[i]<=small)
small=nums[i];
else if(nums[i]<=mid)
mid=nums[i];
else if(nums[i]>mid)
return 1;
}
return 0;
}
};
举报

相关推荐

0 条评论