Leetcode-334.递增三元子数列

话不多说,先上题。

334. 递增的三元子序列

难度中等484

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

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

先看到此题,我的思路是先创建一个二元数组,这里把原数组长度设为n,创建的二元数组为[n][2];[n][0],来保存原本的值,[n][1]来保存顺序,然后再用冒泡排序以[n][0]进行排序,第一个的顺序为最小值的顺序,然后后面如果有两个顺序比他大的,即输出true,否则输出false,这是我第一次想法的代码。

class Solution {
public:
    bool increasingTriplet(vector<int>& nums) {
int n=nums.size();
int temp[n][2];
    for(int k=0;k<nums.size();k++)
    {
        temp[k][0]=nums[k];
        temp[k][1]=k;
    }
    for (int i = 0; i < nums.size()-1; i++)
	    {
            for (int j = 0; j < nums.size() - i - 1; j++)
	        {
                if (temp[j][0] > temp[j+1][0]) 
			    {
                    int temp1 = temp[j][0];
                    temp[j][0] = temp[j+1][0];
                    temp[j+1][0] = temp1;
                    int temp2 = temp[j][1];
                    temp[j][1] = temp[j+1][1];
                    temp[j+1][1] = temp2;
                }
            }
        }
    int temp3=0,temp4=temp[0][1];
    for (int l=0;l<nums.size();l++)
        {
            if(temp4<temp[l][1])
            {
                temp3++;
                temp4=temp[l][1];
            }
        }
    if(temp3<2)
    {
        return false;
    }
    else{
        return true;
    }     
    }
};

 第三十二个的时候错了,便发现了有些数据即使不满足我上面的要求,也可以满足递增三元子数列。我后面还改了一下想骗多几次看看能不能水过去(错误的想法),但确实不行。

我便重新开始审题,重新想,数组的长度最高为5*10e5,用n方的算法就可能会爆,所以必须用O(n)的算法来写,只能用一次遍历,设置两个新的int类型变量,第一个为min,第二个为mid,第一个记录目前出现的最小的数值,第二个记录比min大且比mid小的的数值,然后如果后续有mid大的数值,直接输出true。这样有人可能会问,如果后续mid后面出了比min还小的数值呢,min等于他,然后再发现了比mid大的数,岂不是直接输出了true,但是不符合题意,其实min更小,如果后面有直接比mid大的输出true的话,也是满足题意的,min更小是为了找到更小的mid,从而方便输出,于是我刚开始设置的min为nums[0],mid为nums[1],开始提交

class Solution {
public:
    bool increasingTriplet(vector<int>& nums) {
    if (nums.size() < 3) return false;
    int min = nums[0], mid = nums[1];
 for (auto num : nums) {
      if (num <= min) {
        min = num;
      } else if (num <= mid) {
        mid = num;
      } 
      else if (num > mid) {
        return true;
      }
    }
    return false;    
    }
};

 第六十八个的时候,这种情况下错了,但是我的思路是对的,于是我改了一下我的min和mid的初始值,改为INT_MAX,即int类型的最大值,这样做对程序没有影响,也可以使我的想法得到验证。

class Solution {
public:
    bool increasingTriplet(vector<int>& nums) {
    if (nums.size() < 3) return false;
    int min = INT_MAX, mid = INT_MAX;
 for (auto num : nums) {
      if (num <= min) {
        min = num;
      } else if (num <= mid) {
        mid = num;
      } 
      else if (num > mid) {
        return true;
      }
    }
    return false;    
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值