22.1.2是否存在三升序列

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

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

/*
22.1.12
判断一个数组是否具有三升序列
1.该算法的核心思想就是如果一个数组存在三升序列,那意味着其中必然有一个元素,它左边所以元素的最小值小于该元素,右边所有元素的最大值大于该元素。
2.所有难点在于如何求每个元素的左最小值和右最大值,通过动态规划的手段可以快速构造。 左最小值:比较前一个元素本身和它的左最小值,那个小,来作为当前元素的左最小值,右最大值也类似。
*/
#include
#include
#include
#include
using namespace std;
bool increasingTriplet(vector&nums);
int main()
{
vectora={4,5,2147483647,1,2};
cout<<increasingTriplet(a);
return 0;
}
bool increasingTriplet(vector&nums)
{
int count=nums.size();
vectorleft(count);
vectorright(count);
left[0]=nums[0];
right[count-1]=right[count-1];
for(int i=1;i<count;i++)
{
left[i]=left[i-1]>nums[i-1]?nums[i-1]:left[i-1];
right[count-1-i]=right[count-i]<nums[count-i]?nums[count-i]:right[count-i];
}
for(int i=1;i<count;i++)
{
if(nums[i]>left[i]&&nums[i]<right[i])
return true;
}
return false;
}

/*
22.1.12_2
1.刚开始打算用栈来做,但是该算法与栈有明显的区别,显然栈是无法完成该算法的
2.栈当有比站内元素小的元素入栈时,先把比该元素大的全部弹出,当栈的深度大于三即可,但是三升序列的头不一定是最小元素,很可能是找不到符合条件的,问题就在于当出现比栈底更小的元素时,会把栈都清空。
3.该算法巧妙的利用了三个变量来分别表示三升序列的每个元素,通过寻找比第二个元素大的第三元素来判断,但遇见比第一个元素还小的元素时,它会先假设该最小元素是头,但是第二个元素依然是在该元素的前面的,如果后面有元素大于第二个元素依然满足条件,因为现在的头只是假设真正的头还是在第二个元素之前的。
4.只有后面的元素小于第二个元素并且大于假设的头时,则该元素会成为第二个元素,假设的头成为真正的头。这时后面的元素只有两种情况一是小于第二个元素,那么这更说明前一个头和第二个元素也不会满足情况,如果大于那当前的情况即满足条件。
5.注意一开始第二个元素要设的足够大(大于数组中所有元素才行)
*/
#include
#include
#include
using namespace std;
bool increasingTriplet(vector&nums);
int main()
{
vectora={2,4,-2,-3};
cout<<increasingTriplet(a);
return 0;
}
bool increasingTriplet(vector&nums)
{
int count=nums.size();
int first=nums[0],sec=2147483647;
for(int i=0;i<count;i++)
{
if(nums[i]>sec)
return true;
if(first<nums[i]&&nums[i]<sec)
sec=nums[i];
if(nums[i]<first)
first=nums[i];
}
return false;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值