力扣-334. 递增的三元子序列

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

方法1:

#include <iostream>
#include <vector>
#include <limits.h>
using namespace std;
int main()
{
    int nums[] = {1,2,3,0,5};
    int n = sizeof(nums)/sizeof(nums[0]);
    bool flag = false;
    if (n < 3) {
        flag = false;
        cout<<flag<<endl;
        return 0;
    }
    vector<int> leftMin(n);
    leftMin[0] = nums[0];
    for (int i = 1; i < n; i++) {
        leftMin[i] = min(leftMin[i - 1], nums[i]);
    }
    vector<int> rightMax(n);
    rightMax[n - 1] = nums[n - 1];
    for (int i = n - 2; i >= 0; i--) {
        rightMax[i] = max(rightMax[i + 1], nums[i]);
    }
    for (int i = 1; i < n - 1; i++) {
        if (nums[i] > leftMin[i - 1] && nums[i] < rightMax[i + 1]) {
            flag = true;
            cout<<flag<<endl;
            return 0;
        }
    }
    flag = false;
    cout<<flag<<endl;
}

方法2:

#include <iostream>
#include <vector>
#include <limits.h>
using namespace std;
int main()
{
    int nums[] = {1,2,3,0,5};
    int n = sizeof(nums)/sizeof(nums[0]);
    if (n < 3) {
        cout<<"false"<<endl;
        return 0;
    }
    int first = nums[0];
    int second = INT_MAX;
    for (int i = 1; i < n; i++) {
        int num = nums[i];
        if (num > second) {
            cout<<"true"<<endl;
            return 0;
        } else if (num > first) {
            second = num;
        } else {
            first = num;
        }
    }
    cout<<"false"<<endl;
}

方法一:

时间复杂度为O(n),空间复杂度也为O(n),找一个数,他左边有一个值小于它,右边有一个数大于它

方法二:

时间复杂度为O(n),空间复杂度也为O(1)
可以使用贪心的方法将空间复杂度降到 O(1)。
从左到右遍历数组 nums,遍历过程中维护两个变量 first和 second,分别表示递增的三元子序列中的第一个数和第二个数,任何时候都有 first < second。
初始时,first=nums[0],second=+∞。对于 1≤i<n,当遍历到下标 i 时,令 num=nums[i],进行如下操作:
如果 num>second,则找到了一个递增的三元子序列,返回 true;
否则,如果 num>first,则将 second的值更新为 num;
否则,将 first的值更新为 num。
如果遍历结束时没有找到递增的三元子序列,返回 false。
目录
相关文章
|
Python
【Leetcode刷题Python】376. 摆动序列
文章提供了解决LeetCode "摆动序列" 问题的Python实现代码,通过遍历整数数组并使用两个变量 down 和 up 来记录正差和负差摆动序列的长度,最终返回最长摆动子序列的长度。
135 0
|
1月前
|
存储 C++ 索引
最长连续序列(每天刷力扣hot100系列)
本题使用哈希表法求最长连续序列。利用unordered_set存储去重元素,遍历集合时仅当num-1不存在时才作为起点向后扩展,统计连续长度,时间复杂度O(n),空间复杂度O(n)。相比unordered_map更高效,因无需存储值。
|
5月前
|
Go
【LeetCode 热题100】DP 实战进阶:最长递增子序列、乘积最大子数组、分割等和子集(力扣300 / 152/ 416 )(Go语言版)
本文深入解析三道经典的动态规划问题:**最长递增子序列(LIS)**、**乘积最大子数组** 和 **分割等和子集**。 - **300. LIS** 通过 `dp[i]` 表示以第 `i` 个元素结尾的最长递增子序列长度,支持 O(n²) 动态规划与 O(n log n) 的二分优化。 - **152. 乘积最大子数组** 利用正负数特性,同时维护最大值与最小值的状态转移方程。 - **416. 分割等和子集** 转化为 0-1 背包问题,通过布尔型 DP 实现子集和判断。 总结对比了三题的状态定义与解法技巧,并延伸至相关变种问题,助你掌握动态规划的核心思想与灵活应用!
243 1
|
Python
【Leetcode刷题Python】946. 验证栈序列
LeetCode题目“946. 验证栈序列”的Python解决方案,通过模拟栈的压入和弹出操作来验证给定的两个序列是否能通过合法的栈操作得到。
172 6
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
121 3
|
Python
【Leetcode刷题Python】105. 从前序与中序遍历序列构造二叉树
LeetCode上105号问题"从前序与中序遍历序列构造二叉树"的Python实现,通过递归方法根据前序和中序遍历序列重建二叉树。
170 3
|
算法 Python
【Leetcode刷题Python】300. 最长递增子序列
LeetCode 300题 "最长递增子序列" 的两种Python解决方案:一种使用动态规划,另一种使用贪心算法结合二分查找。
138 1
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
164 0
|
Python
【Leetcode刷题Python】674. 最长连续递增序列
LeetCode 674题 "最长连续递增序列" 的Python解决方案,使用动态规划算法找出给定整数数组中最长连续递增子序列的长度。
213 0
|
存储 算法
力扣经典150题第四十六题:最长连续序列
力扣经典150题第四十六题:最长连续序列
112 0