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

Formally the function should:

Return true if there exists i, j, k 
such that arr[i] < arr[j] < arr[k] given 0 ≤ i < j < k ≤ n-1 else return false.

Your algorithm should run in O(n) time complexity and O(1) space complexity.

Examples:
Given [1, 2, 3, 4, 5],
return true.

Given [5, 4, 3, 2, 1],
return false.

Credits:
Special thanks to @DjangoUnchained for adding this problem and creating all test cases.

这道题让我们求一个无序数组中是否有任意三个数字是递增关系的,我最先相处的方法是用一个dp数组,dp[i]表示在i位置之前小于等于nums[i]的数字的个数(包括其本身),我们初始化dp数组都为1,然后我们开始遍历原数组,对当前数字nums[i],我们遍历其之前的所有数字,如果之前某个数字nums[j]小于nums[i],那么我们更新dp[i] = max(dp[i], dp[j] + 1),如果此时dp[i]到3了,则返回true,若遍历完成,则返回false,参见代码如下:

解法一:

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

但是题目中要求我们O(n)的时间复杂度和O(1)的空间复杂度,上面的那种方法一条都没满足,所以白写了。我们下面来看满足题意的方法,这个思路是使用两个指针m1和m2,初始化为整型最大值,我们遍历数组,如果m1大于等于当前数字,则将当前数字赋给m1;如果m1小于当前数字且m2大于等于当前数字,那么将当前数字赋给m2,一旦m2被更新了,说明一定会有一个数小于m2,那么我们就成功的组成了一个长度为2的递增子序列,所以我们一旦遍历到比m2还大的数,我们直接返回ture。如果我们遇到比m1小的数,还是要更新m1,有可能的话也要更新m2为更小的值,毕竟m2的值越小,能组成长度为3的递增序列的可能性越大,参见代码如下:

解法二:

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

如果觉得上面的解法不容易想出来,那么如果能想出下面这种解法,估计面试官也会为你点赞。这种方法的虽然不满足常数空间的要求,但是作为对暴力搜索的优化,也是一种非常好的解题思路。这个解法的思路是建立两个数组,forward数组和backward数组,其中forward[i]表示[0, i]之间最小的数,backward[i]表示[i, n-1]之间最大的数,那么对于任意一个位置i,如果满足 forward[i] < nums[i] < backward[i],则表示这个递增三元子序列存在,举个例子来看吧,比如:

nums:        8  3  5  1  6

foward:      8  3  3  1  1

backward:  8  6  6  6  6

我们发现数字5满足forward[i] < nums[i] < backward[i],所以三元子序列存在。

解法三:

class Solution {
public:bool increasingTriplet(vector<int>& nums) {if (nums.size() < 3) return false;int n = nums.size();vector<int> f(n, nums[0]), b(n, nums.back());for (int i = 1; i < n; ++i) {f[i] = min(f[i - 1], nums[i]);}for (int i = n - 2; i >= 0; --i) {b[i] = max(b[i + 1], nums[i]);}for (int i = 0; i < n; ++i) {if (nums[i] > f[i] && nums[i] < b[i]) return true;}return false;}
};

本文转自博客园Grandyang的博客,原文链接:递增的三元子序列[LeetCode] Increasing Triplet Subsequence ,如需转载请自行联系原博主。

[LeetCode] Increasing Triplet Subsequence 递增的三元子序列相关推荐

  1. LeetCode Increasing Triplet Subsequence(动态规划)

    问题:问数组中是否存在一个上升的三元子序列 思路:方法一是使用动态规划求解上升子序列,如果子序列长度等于3,说明存在 方法二是使用small,mid分别记录最小值,第二小值,如果当前值比small小则 ...

  2. LeetCode第334题 递增的三元子序列(c++)(建议二刷)

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

  3. Leetcode: Increasing Triplet Subsequence

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

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

    原题链接: Leetcode 334.递增的三元子序列 Given an integer array nums, return true if there exists a triple of ind ...

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

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

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

    一.题目 给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列. 如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 nums[i] ...

  7. Python描述 LeetCode 334. 递增的三元子序列

    Python描述 LeetCode 334. 递增的三元子序列   大家好,我是亓官劼(qí guān jié ),在[亓官劼]公众号.CSDN.GitHub.B站等平台分享一些技术博文,主要包括前端 ...

  8. LeetCode 每日一题打卡:334.递增的三元子序列

    题目 334.递增的三元子序列 题目大意 给你一个整数数组numsnumsnums ,判断这个数组中是否存在长度为333的递增子序列. 如果存在这样的三元组下标(i,j,k)(i, j, k)(i,j ...

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

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

  10. 334. 递增的三元子序列(中等 贪心 数组)

    334. 递增的三元子序列 给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列. 如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 ...

最新文章

  1. MySQL面试题 | 附答案解析(六)
  2. centos架设lamp环境 php+mysql+httpd+vsftp
  3. html5网站测试工具,基于HTML5网页的前端技术测试技巧
  4. 应用视觉设计_Day01
  5. 32岁被裁,拿N+1,我高兴地失业了
  6. 什么叫侧面指纹识别_前面侧面还是背面?手机指纹识别放哪儿合适
  7. Angular路由开发的一个实际例子
  8. k8s pod里访问不到外部ip_安全公告:影响所有K8s版本的设计缺陷
  9. C#中面向连接的客户端与服务端编程
  10. 数值方法与计算机算法试卷,《数值方法与计算机算法》课程教学大纲.pdf
  11. 再议动态二维数组,通过一句表达式完成矩阵的转置
  12. java代码发送邮箱_邮件发送 - java代码库 - 云代码
  13. 三个linux系统共存,修改默认启动
  14. 飞行管理计算机组成,飞行模拟中飞行管理计算机系统CDU组件设计与仿真
  15. python语言是不是多模型语言_Python模型转换为Modelica模型的方法与流程
  16. 数学规划模型之线性规划
  17. random和stochastic的区别
  18. 原生Android设置sim卡锁定,开启SIM卡密码保护
  19. 万能密码为什么能成功
  20. Centos8搭建并应用NIS服务

热门文章

  1. IOS笔记 : addChildViewController
  2. JavaScript—计算图片加载的张数。
  3. Ubuntu 11.10 下安装 JDK_6_27
  4. 写一个微信和支付宝订单的查询方法:
  5. scala中“=”的4种使用场景
  6. 一本通1598【 例 2】最大连续和
  7. 理解 JavaScript 的 async/await(转)
  8. Android零基础入门第42节:自定义BaseAdapter
  9. 科罗拉多州立大学计算机优势,盘点科罗拉多州立大学优势专业主要看排行榜
  10. java static 可见性_java可重入锁可见性分析