一、题目描述

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

数学表达式如下:

如果存在这样的 i, j, k,  且满足 0 ≤ i < j < k ≤ n-1,
使得 arr[i] < arr[j] < arr[k] ,返回 true ; 否则返回 false 。

说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1) 。

示例 1:

输入: [1,2,3,4,5]
输出: true

示例 2:

输入: [5,4,3,2,1]
输出: false

二、题目分析和代码实现

1、第一种方法——最直接的思路

1)采用动态规划的方法,dp[i]代表以nums[i]为结尾的递增子序列长度
2)dp[i]=max{dp[j]+1},j<i&&nums[j]<nums[i]
3)时间复杂度为n*n

 class Solution {
public:
bool increasingTriplet(vector<int>& nums) {
int n = nums.size();
if (n < )return false;
vector<int>dp(n, );
for (int i = ; i < n; ++i) {
for (int j = ; j < i; ++j) {
if (nums[j] < nums[i])
dp[i] = max(dp[i], dp[j] + );
}
if (dp[i] == )return true;
}
return false;
}
};

2、符合题目要求的方法——最佳思路,但是比较难想

1)用两个数字m1代表当前最小的数,m2代表遍历到现在第二小的数,m2的位置不一定要在m1之后
2)那么当发现一个数大于m2的数的时候,就直接返回true
3)时间复杂度为n,空间复杂度为常数

 class Solution {
public:
bool increasingTriplet(vector<int>& nums) {
int n = nums.size();
int m1 = INT_MAX, m2 = INT_MAX;
for (int i = ; i < n; ++i) {
if (nums[i] <= m1)m1 = nums[i];
else if (nums[i] <= m2)m2 = nums[i];//要注意等号,也就是遇到相等的也要向后移动
else return true;
}
return false;
}
};

3)另一种方法——思路很赞

1)Min[i]代表从0到i的最小值,Max[i]代表从i到n的最大值
2)如果nums[i]大于Min[i-1]并且小于Max[i+1],那么就返回真
3)时间复杂度为n,空间复杂度为n

 class Solution {
public:
bool increasingTriplet(vector<int>& nums) {
int n = nums.size();
if (n < )return false;
vector<int> Min(n), Max(n);
int i;
Min[] = nums[], Max[n - ] = nums[n - ];
for (i = ; i < n; ++i) {
Min[i] = min(Min[i - ], nums[i]);
Max[n - - i] = max(Max[n - i], nums[n - - i]);//注意下标
}
for (int i = ; i < n - ; ++i) {
if (nums[i] > Min[i - ] && nums[i] < Max[i + ])
return true;
}
return false;
}
};

[Leetcode] 第334题 递增的三元子序列的更多相关文章

  1. [LeetCode] Increasing Triplet Subsequence 递增的三元子序列

    Given an unsorted array return whether an increasing subsequence of length 3 exists or not in the ar ...

  2. LeetCode:递增的三元子序列【334】

    LeetCode:递增的三元子序列[334] 题目描述 给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列. 数学表达式如下: 如果存在这样的 i, j, k,  且满足 0 ≤ i ...

  3. Java实现 LeetCode 334 递增的三元子序列

    334. 递增的三元子序列 给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列. 数学表达式如下: 如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ...

  4. Leetcode 334.递增的三元子序列

    递增的三元子序列 给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列. 数学表达式如下: 如果存在这样的 i, j, k,  且满足 0 ≤ i < j < k ≤ n- ...

  5. 【LeetCode】334#递增的三元子序列

    题目描述 给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列. 数学表达式如下: 如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ≤ n-1, 使得 ...

  6. 【JavaScript】Leetcode每日一题-递增顺序搜索树

    [JavaScript]Leetcode每日一题-递增顺序搜索树 [题目描述] 给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没 ...

  7. 【python】Leetcode每日一题-最长公共子序列

    [python]Leetcode每日一题-最长公共子序列 [题目描述] 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度.如果不存在 公共子序列 ,返回 0 . ...

  8. 334 Increasing Triplet Subsequence 递增的三元子序列

    给定一个未排序的数组,请判断这个数组中是否存在长度为3的递增的子序列.正式的数学表达如下:    如果存在这样的 i, j, k,  且满足 0 ≤ i < j < k ≤ n-1,    ...

  9. [Swift]LeetCode334. 递增的三元子序列 | Increasing Triplet Subsequence

    Given an unsorted array return whether an increasing subsequence of length 3 exists or not in the ar ...

随机推荐

  1. 小白学Python(1)——安装与调试,“你好,世界”,“hello,world”

    之前从没接触过编程之类的东西,在网上下载个自己需要的软件真实比较麻烦,找了半天总是没有合适的,好不容易找到了,不过那家公司已经倒闭了,软件不更新也运行不了了,于是乎,求人不如求己,自己没事编程吧. 在 ...

  2. Appium+Python API相关知识了解

    首先,要先了解,官方Appium API // https://testerhome.com/topics/3144 刚开始的时候,没有看官方API,然后在网上瞎找学习资料,发现python相关的很少 ...

  3. Code signing is required for product type 'Unit Test Bundle' in SDK 'iOS 11.0.1'

    Code signing is required for product type 'Unit Test Bundle' in SDK 'iOS 11.0.1' 进入 projects and lis ...

  4. Redux概览

    简介 Redux 是一个有用的架构 Redux 的适用场景:多交互.多数据源 工作流程图 action 用户请求 //发出一个action import { createStore } from 'r ...

  5. mybatis嵌套map或者map嵌套的parameterType

    Spring的重要注解 https://www.cnblogs.com/rolandlee/p/11014923.html 一:首先是map嵌套: 例1: 例2: 总结: paramterType无论 ...

  6. 【数据结构】9.java源码关于HashTable

    1.hashtable的内部结构 基础存储数据的hash桶由Entry结构的数组存放而entry数据结构,有hash,key和value,还有一个指向下一个节点的引用next对象 这里就和hashma ...

  7. Docker学习总结(一)--Docker简介

    什么是虚拟化 在计算机中,虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器.网络.内存等,以抽象.转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比之前更好的应用这些资源. 在实 ...

  8. Leetcode之回溯法专题-79. 单词搜索(Word Search)

    Leetcode之回溯法专题-79. 单词搜索(Word Search) 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元 ...

  9. Mysql根据出生日期计算年龄五种方法比较

    方法一 SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthday)), '%Y')+0 AS age 方法一缺陷,就是当日期为未来日期时 ...

  10. P1613 跑路 倍增思想 + 邻接矩阵

    题意 给定一个有向图,每条边的花费为1.现在有一个空间跑路器,可以走2^k长度的路,只用花1秒的时间.问从1走到n最少的时间.n <= 50, k <= 64. 思路 这道题说是倍增,但是 ...