问题描述:
给你一个整数数组 nums
,判断这个数组中是否存在长度为 3
的递增子序列。
如果存在这样的三元组下标 (i, j, k)
且满足 i < j < k
,使得 nums[i] < nums[j] < nums[k]
,返回 true
;否则,返回 false
示例一:
输入:nums = [1,2,3,4,5]
输出:true
解释:任何 i < j < k 的三元组都满足题意
示例二:
输入:nums = [5,4,3,2,1]
输出:false
解释:不存在满足题意的三元组
示例三:
输入:nums = [2,1,5,0,4,6]
输出:true
解释:三元组 (3, 4, 5) 满足题意,因为 nums[3] == 0 < nums[4] == 4 < nums[5] ==
题目分析:
这道相对比较简单,只需要设置连个变量,通过一次遍历和几次比较就可以非出答案,具体的解法
如下:
创建两个变量分别是a,b,将a初始化成已给数组的第一个元素,将b初始化成int的最大值,
从第二个元素开始遍历数组:
首先判断 nums[i] > b
如果满足,直接返回,对应找到了递增的三原子序列,当然在第一次是不可能的,最少遍历两次才
能实现。
在不满足上述条件的情况下,再次判断nums[i] > a
如果满足上述条件,直接将nums[i]赋值给b,比a大比b小,说明将其替代b可以得到更有的解,这
里就体现了贪心算法。
在不满足上述所有条件的情况下,
直接将num[i]赋值给a,这里也是贪心算法的体现。
最后如果循环结束后还没返回,说明没找到递增的三元组,直接返回false.
对应的代码如下:
class Solution
{
public:bool increasingTriplet(vector<int>& nums) {int a = nums[0];int b = INT_MAX;for(int i = 1;i < nums.size();i++){if(nums[i] > b){return true;}else if(nums[i] > a){b = nums[i]; }else{a = nums[i];}}return false;}
};
这就是这到题的解法,用两个变量是最简单的。