博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
334 Increasing Triplet Subsequence 递增的三元子序列
阅读量:5268 次
发布时间:2019-06-14

本文共 1362 字,大约阅读时间需要 4 分钟。

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

正式的数学表达如下:
    如果存在这样的 i, j, k,  且满足 0 ≤ i < j < k ≤ n-1,
    使得 arr[i] < arr[j] < arr[k] ,返回 true ; 否则返回 false 。
要求算法时间复杂度为O(n),空间复杂度为O(1) 。
示例:
输入 [1, 2, 3, 4, 5],
输出 true.
输入 [5, 4, 3, 2, 1],
输出 false.

详见:https://leetcode.com/problems/increasing-triplet-subsequence/description/

C++:

方法一:超时

class Solution {public:    bool increasingTriplet(vector
& nums) { int n=nums.size(); vector
dp(n,1); for(int i=0;i
=3) { return true; } } } return false; }};

 方法二:

使用两个指针m1和m2,初始化为整型最大值,遍历数组,如果m1大于等于当前数字,则将当前数字赋给m1;如果m1小于当前数字且m2大于等于当前数字,那么将当前数字赋给m2,一旦m2被更新了,说明一定会有一个数小于m2,那么就成功的组成了一个长度为2的递增子序列,所以一旦遍历到比m2还大的数,直接返回ture。如果遇到比m1小的数,还是要更新m1,有可能的话也要更新m2为更小的值,毕竟m2的值越小,能组成长度为3的递增序列的可能性越大。

class Solution {public:    bool increasingTriplet(vector
& nums) { int m1=INT_MAX,m2=INT_MAX; for(int a:nums) { if(m1>=a) { m1=a; } else if(m2>=a) { m2=a; } else { return true; } } return false; }};

 参考:https://www.cnblogs.com/grandyang/p/5194599.html

转载于:https://www.cnblogs.com/xidian2014/p/8834858.html

你可能感兴趣的文章
linux下WPS的使用
查看>>
hdu 3938 并查集
查看>>
instanceof
查看>>
《深入分析Java Web技术内幕》读书笔记之JVM内存管理
查看>>
python之GIL release (I/O open(file) socket time.sleep)
查看>>
2015/8/4 告别飞思卡尔,抛下包袱上路
查看>>
软件开发与模型
查看>>
161017、SQL必备知识点
查看>>
kill新号专题
查看>>
MVC学习系列——Model验证扩展
查看>>
mysqladmin 修改和 初始化密码
查看>>
字符串
查看>>
vue2.x directive - 限制input只能输入正整数
查看>>
实现MyLinkedList类深入理解LinkedList
查看>>
自定义返回模型
查看>>
C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 客户端多网络支持
查看>>
HDU 4122
查看>>
Suite3.4.7和Keil u3自带fx2.h、fx2regs.h文件的异同
查看>>
打飞机游戏【来源于Crossin的编程教室 http://chuansong.me/account/crossincode 】
查看>>
[LeetCode] Merge Intervals
查看>>