​LeetCode刷题实战334:递增的三元子序列

共 2509字,需浏览 6分钟

 ·

2021-07-27 00:59

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 递增的三元子序列,我们先来看题面:
https://leetcode-cn.com/problems/increasing-triplet-subsequence/

Given an integer array nums, return true if there exists a triple of indices (i, j, k) such that i < j < k and nums[i] < nums[j] < nums[k]. If no such indices exists, return false.

给你一个整数数组 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


解题

用a、b、c来表示三元子序列的三个元素:其中用c来遍历数组,用a来始终记录最小的元素,用b来记录子序列中最大的元素。然后再遍历的时候,不断地更新a,同时也要保证b尽可能地小,如果遍历到的元素c大于a同时也大于b的话,表示找到三元组了,返回true。


class Solution {
public:
    bool increasingTriplet(vector<int>& nums) {
        if(nums.size()<3)return false;
        
        //用a始终记录最小的元素,b为子序列中第二大的元素
        int a=INT_MAX,b=INT_MAX;
        
        //然后不断更新a,同时保持b尽可能的小。如果下一个元素比b大证明找到了三元组
        for(const auto c:nums){
            if(c<=a)a=c; //c小于等于a,a更新为新出现的较小值
            else if(c<=b)b=c; //c大于a同时c小于等于b,b更新为大于a的较小值
            else return true; //c大于a同时也大于b,证明找到三元组了
        }
        return false;
    }
};


好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:

LeetCode1-320题汇总,希望对你有点帮助!

LeetCode刷题实战321:拼接最大数

LeetCode刷题实战322:零钱兑换

LeetCode刷题实战323:无向图中连通分量的数目

LeetCode刷题实战324:摆动排序 II

LeetCode刷题实战325:和等于 k 的最长子数组长度

LeetCode刷题实战326:3的幂
LeetCode刷题实战327:区间和的个数
LeetCode刷题实战328:奇偶链表
LeetCode刷题实战329:矩阵中的最长递增路径
LeetCode刷题实战330:按要求补齐数组
LeetCode刷题实战331:验证二叉树的前序序列化
LeetCode刷题实战332:重新安排行程
LeetCode刷题实战333:最大 BST 子树

浏览 16
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报