【数据结构和算法】递增的三元子序列

简介: 给你一个整数数组nums,判断这个数组中是否存在长度为3的递增子序列。如果存在这样的三元组下标(i, j, k)且满足i < j < k,使得nums[i] < nums[j] < nums[k],返回true;否则,返回false。

其他系列文章导航

Java基础合集

数据结构与算法合集

设计模式合集

多线程合集

分布式合集

ES合集


文章目录

其他系列文章导航

文章目录

前言

一、题目描述

二、题解

2.1 方法一:贪心 + 二分

2.2 方法二:贪心(优化)

三、代码

3.1 方法一:贪心 + 二分

3.2 方法二:贪心(优化)

四、复杂度分析

4.1 方法一:贪心 + 二分

4.2 方法二:贪心(优化)


前言

这是力扣的334题,难度为中等,解题方案有很多种,本文讲解我认为最奇妙的两种。


一、题目描述

给你一个整数数组 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) 的解决方案吗?


    二、题解

    题目要我们判断是否存在长度为 3 的上升子序列,问题可以转换为求 nums 的最长上升子序列的长度。

    如果 nums 的最长上升子序列长度大于等于 3,那么原问题答案为 True,否则为 False。

    2.1 方法一:贪心 + 二分

    思路与算法:

    简单来说,就是在遍历每个数 nums[i] 的同时,维护一个具有单调性的 f[ ] 数组,其中 f[len]=x 代表长度为 len 的最长上升子序列最小结尾元素为 x,可以证明 f 数组具有单调性,因此每次可以通过二分找到小于 nums[i] 的最大下标,来作为 nums[i] 的前一个数。

    综上,我们求得最长上升子序列的最大长度,然后和 3 比较即可得出答案。

    2.2 方法二:贪心(优化)

    方法二达到了进阶的要求!

    思路与算法:

    我们可以对 f 数组进行优化:使用有限变量进行替换(将 f 数组的长度压缩为 2),数组含义不变,f[1]=x 代表长度为 1 的上升子序列最小结尾元素为 x,f[2]=y 代表长度为 2 的上升子序列的最小结尾元素为 y。

    从前往后扫描每个 nums[i],每次将 nums[i] 分别与 f[1]] 和 f[2] 进行比较,如果能够满足 nums[i]>f[2],代表 nums[i] 能够接在长度为 2 的上升子序列的后面,直接返回 True,否则尝试使用 nums[i] 来更新 f[1] 和 f[2]。

    这样,我们只使用了有限变量,每次处理 nums[i] 只需要和有限变量进行比较。


    三、代码

    3.1 方法一:贪心 + 二分

    Java版本:

    class Solution {
        public boolean increasingTriplet(int[] nums) {
            int n = nums.length, ans = 1;
            int[] f = new int[n + 1];
            Arrays.fill(f, Integer.MAX_VALUE);
            for (int i = 0; i < n; i++) {
                int t = nums[i];
                int l = 1, r = i + 1;
                while (l < r) {
                    int mid = l + r >> 1;
                    if (f[mid] >= t) {
                        r = mid;
                    } else {
                        l = mid + 1;
                    }
                }
                f[r] = t;
                ans = Math.max(ans, r);
            }
            return ans >= 3;
        }
    }

    image.gif

    C++版本:

    #include <vector>
    #include <climits>
    using namespace std;
    class Solution {
    public:
        bool increasingTriplet(vector<int>& nums) {
            int n = nums.size(), ans = 1;
            vector<int> f(n + 1, INT_MAX);
            for (int i = 0; i < n; i++) {
                int t = nums[i];
                int l = 1, r = i + 1;
                while (l < r) {
                    int mid = l + (r - l) / 2;
                    if (f[mid] >= t) {
                        r = mid;
                    } else {
                        l = mid + 1;
                    }
                }
                f[r] = t;
                ans = max(ans, r);
            }
            return ans >= 3;
        }
    };

    image.gif

    Python版本:

    def increasingTriplet(nums):
        n = len(nums)
        ans = 1
        f = [float('inf')] * (n + 1)
        for i in range(n):
            t = nums[i]
            l, r = 1, i + 1
            while l < r:
                mid = (l + r) // 2
                if f[mid] >= t:
                    r = mid
                else:
                    l = mid + 1
            f[r] = t
            ans = max(ans, r)
        return ans >= 3

    image.gif

    3.2 方法二:贪心(优化)

    Java版本:

    class Solution {
        public boolean increasingTriplet(int[] nums) {
            int n = nums.length;
            long[] f = new long[3];
            f[1] = f[2] = Integer.MAX_VALUE;
            for (int t : nums) {
                if (f[2] < t) {
                    return true;
                } else if (f[1] < t && t < f[2]) {
                    f[2] = t;
                } else if (f[1] > t) {
                    f[1] = t;
                }
            }
            return false;
        }
    }

    image.gif

    C++版本:

    class Solution {
    public:
        bool increasingTriplet(vector<int>& nums) {
            int n = nums.size();
            long long f[3] = {INT_MAX, INT_MAX, INT_MAX};
            for (int t : nums) {
                if (f[2] < t) {
                    return true;
                } else if (f[1] < t && t < f[2]) {
                    f[2] = t;
                } else if (f[1] > t) {
                    f[1] = t;
                }
            }
            return false;
        }
    };

    image.gif

    Python版本:

    class Solution:
        def increasingTriplet(self, nums: List[int]) -> bool:
            n = len(nums)
            f = [float('inf'), float('inf'), float('inf')]
            for t in nums:
                if f[2] < t:
                    return True
                elif f[1] < t < f[2]:
                    f[2] = t
                elif f[1] > t:
                    f[1] = t
            return False

    image.gif


    四、复杂度分析

    4.1 方法一:贪心 + 二分

      • 时间复杂度:O(nlog⁡n)
      • 空间复杂度:O(n)

      4.2 方法二:贪心(优化)

        • 时间复杂度:O(n)
        • 空间复杂度:O(1)
        目录
        相关文章
        |
        5月前
        |
        机器学习/深度学习 算法 数据挖掘
        基于WOA鲸鱼优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
        本项目基于MATLAB 2022a/2024b实现,采用WOA优化的BiLSTM算法进行序列预测。核心代码包含完整中文注释与操作视频,展示从参数优化到模型训练、预测的全流程。BiLSTM通过前向与后向LSTM结合,有效捕捉序列前后文信息,解决传统RNN梯度消失问题。WOA优化超参数(如学习率、隐藏层神经元数),提升模型性能,避免局部最优解。附有运行效果图预览,最终输出预测值与实际值对比,RMSE评估精度。适合研究时序数据分析与深度学习优化的开发者参考。
        |
        5月前
        |
        机器学习/深度学习 算法 数据安全/隐私保护
        基于GA遗传优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
        本内容包含基于BiLSTM与遗传算法(GA)的算法介绍及实现。算法通过MATLAB2022a/2024b运行,核心为优化BiLSTM超参数(如学习率、神经元数量),提升预测性能。LSTM解决传统RNN梯度问题,捕捉长期依赖;BiLSTM双向处理序列,融合前文后文信息,适合全局信息任务。附完整代码(含注释)、操作视频及无水印运行效果预览,适用于股票预测等场景,精度优于单向LSTM。
        |
        2月前
        |
        机器学习/深度学习 算法 数据安全/隐私保护
        基于WOA鲸鱼优化的XGBoost序列预测算法matlab仿真
        基于WOA优化XGBoost的序列预测算法,利用鲸鱼优化算法自动寻优超参数,提升预测精度。结合MATLAB实现,适用于金融、气象等领域,具有较强非线性拟合能力,实验结果表明该方法显著优于传统模型。(238字)
        |
        4月前
        |
        存储 监控 安全
        企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
        企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
        151 1
        |
        5月前
        |
        算法 数据安全/隐私保护
        基于Logistic-Map混沌序列的数字信息加解密算法matlab仿真,支持对文字,灰度图,彩色图,语音进行加解密
        本项目实现了一种基于Logistic Map混沌序列的数字信息加解密算法,使用MATLAB2022A开发并包含GUI操作界面。支持对文字、灰度图像、彩色图像和语音信号进行加密与解密处理。核心程序通过调整Logistic Map的参数生成伪随机密钥序列,确保加密的安全性。混沌系统的不可预测性和对初值的敏感依赖性是该算法的核心优势。示例展示了彩色图像、灰度图像、语音信号及文字信息的加解密效果,运行结果清晰准确,且完整程序输出无水印。
        基于Logistic-Map混沌序列的数字信息加解密算法matlab仿真,支持对文字,灰度图,彩色图,语音进行加解密
        |
        5月前
        |
        机器学习/深度学习 算法 数据安全/隐私保护
        基于PSO粒子群优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
        本项目基于MATLAB2022a/2024b开发,结合粒子群优化(PSO)算法与双向长短期记忆网络(BiLSTM),用于优化序列预测任务中的模型参数。核心代码包含详细中文注释及操作视频,涵盖遗传算法优化过程、BiLSTM网络构建、训练及预测分析。通过PSO优化BiLSTM的超参数(如学习率、隐藏层神经元数等),显著提升模型捕捉长期依赖关系和上下文信息的能力,适用于气象、交通流量等场景。附有运行效果图预览,展示适应度值、RMSE变化及预测结果对比,验证方法有效性。
        |
        4月前
        |
        存储 监控 算法
        基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
        跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
        147 0
        |
        5月前
        |
        算法 数据安全/隐私保护
        基于混沌序列和小波变换层次化编码的遥感图像加密算法matlab仿真
        本项目实现了一种基于小波变换层次化编码的遥感图像加密算法,并通过MATLAB2022A进行仿真测试。算法对遥感图像进行小波变换后,利用Logistic混沌映射分别对LL、LH、HL和HH子带加密,完成图像的置乱与扩散处理。核心程序展示了图像灰度化、加密及直方图分析过程,最终验证加密图像的相关性、熵和解密后图像质量等性能指标。通过实验结果(附图展示),证明了该算法在图像安全性与可恢复性方面的有效性。
        |
        5月前
        |
        机器学习/深度学习 数据采集 算法
        基于GWO灰狼优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
        本项目基于Matlab 2022a/2024b实现,结合灰狼优化(GWO)算法与双向长短期记忆网络(BiLSTM),用于序列预测任务。核心代码包含数据预处理、种群初始化、适应度计算及参数优化等步骤,完整版附带中文注释与操作视频。BiLSTM通过前向与后向处理捕捉序列上下文信息,GWO优化其参数以提升预测性能。效果图展示训练过程与预测结果,适用于气象、交通等领域。LSTM结构含输入门、遗忘门与输出门,解决传统RNN梯度问题,而BiLSTM进一步增强上下文理解能力。
        |
        8月前
        |
        机器学习/深度学习 算法 数据安全/隐私保护
        基于模糊神经网络的金融序列预测算法matlab仿真
        本程序为基于模糊神经网络的金融序列预测算法MATLAB仿真,适用于非线性、不确定性金融数据预测。通过MAD、RSI、KD等指标实现序列预测与收益分析,运行环境为MATLAB2022A,完整程序无水印。算法结合模糊逻辑与神经网络技术,包含输入层、模糊化层、规则层等结构,可有效处理金融市场中的复杂关系,助力投资者制定交易策略。
        下一篇
        oss云网关配置