一、题目描述

给定一个未排序的数组,判断这个数组中是否存在长度为 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. Jmeter 02 Jmeter断言之响应断言

    看完上一篇博客,相信大家应该可以使用Jmeter发送HTTP请求了.那么我们既然是要测试,就肯定需要判断结果了.Jmeter对于请求的响应数据提供了几种断言机制,这里大概说一下比较常用的几种断言. 响 ...

  2. 持续集成高级篇之Jekins脚本参数化构建

    系列目录 本系列已经很久没有更新了,接前面基础篇,本系统主要介绍jenkins构建里的一些高级特性.包括脚本参数化,Jenkins Pipeline与及在PipeLine模式下如何执行常见的传统构建任 ...

  3. HOWTO: Amira/Avizo中如何设置数据尺度单位

    很多朋友是数据量化完成后,问统计表中的数据尺度单位,这种情况恐怕需要从头再处理一次,所以对于Amira/Avizo的新用户来说,在准备进行量化分析之前就应该设置好尺度单位,设置步骤如下: 1.  在A ...

  4. ionic 技术要点

    1.当遇到数据模型改变了,但是页面渲染的数据却没有改变的时候,尝试执行 $scope.$apply(): 2.时间的定义及监听: 定义事件 showNewMsg并从scope往下广播: $scope. ...

  5. windows下 ionic 打包app --以安卓版本为例

    环境安装 1.nodejs 安装版本5.7,尽量不要安装太新的版本,因为可能会出现兼容性问题,一开始本人安装的是6.+的版本,后来出现问题的,马上换回5.7的,问题就不会出现了. 安装教程网上教程很多 ...

  6. 翻牌动画(CocosCreator)

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321       在游戏中,有时候为了通过一种有意思的途径,让用户在一些物品中随机获取某种物品,除了前面我们提到的使用大转盘抽奖获得, ...

  7. egret之一维,二维数组

    一维数组转换成二维数组下标公式: 行=下标/二维数组列数 列=下标%二维数组列数+1 ] + ); ] + ); 二维数组转一维数组: 下标=(二维数当前行-1)*列数+二维数当前列-1: let i ...

  8. C++ switch注意事项(陷阱)

    话不多说,直接上代码 int a; printf("请输入一个整数:"); scanf("%d", &a); switch (a) { : printf ...

  9. Delphi - cxGrid设定合并单元格

    在cxGrid中选中需要合并的字段,单击F11调出属性控制面板,展开Options,设置CellMerging的Value为True.

  10. 牛客 136J-洋灰三角 +高中数学博大精深

    参考学习:http://www.cnblogs.com/l609929321/p/9500814.html 牛客 136J-洋灰三角 题意: 在一个1 * n的棋盘中,第一格放1,之后的每一个放前一个 ...