一、题目描述

给定一个未排序的数组,判断这个数组中是否存在长度为 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;
}
};

最新文章

  1. 透视 HTML子元素的margin-top样式会应用在父元素上的原由
  2. CSS过滤器
  3. 4、C#进阶:MD5加密、进程、线程、GDI+、XML、委托
  4. 深入JVM-Class装载系统
  5. Jquery实现下拉联动表单
  6. 深入理解Java中的继承
  7. 解决Windows Server 2003不认U盘或移动硬盘的问题
  8. win7 64位 VS2010调试提示“ORA-12154: TNS: 无法解析指定的连接标识符”的解决方法
  9. direct3D directX
  10. Java位运算总结:位运算用途广泛《转》
  11. Let the Balloon Rise(map)
  12. Loadrunner11.00破解方法
  13. Webpack单元测试,e2e测试
  14. docker 安装与学习
  15. mac下的readelf和objdump
  16. MongoDB与python交互
  17. python实现使用词云展示图片
  18. win7的python3.5安装numpy包
  19. Python在金融量开源项目列表
  20. TravelPort官方API解读

热门文章

  1. Linux下Kafka下载与安装教程
  2. static用法总结:
  3. SharpMap&#160;V1.1&#160;For&#160;Web教程系列之——地图展示
  4. 关于前端jsonp跨域和一个简单的node服务搭建
  5. alter add命令用来增加表的字段
  6. BigDecimal 使用浅析
  7. Keras(六)Autoencoder 自编码 原理及实例 Save&amp;reload 模型的保存和提取
  8. 2019nc#2
  9. BZOJ-3343教主的魔法+分块(大块排序二分)
  10. CF - 1108 F MST Unification