334. 递增的三元子序列贪心动态规划Normal
Posted pre_eminent
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了334. 递增的三元子序列贪心动态规划Normal相关的知识,希望对你有一定的参考价值。
题目
难度中等
给你一个整数数组 nums
,判断这个数组中是否存在长度为 3
的递增子序列。
如果存在这样的三元组下标 (i, j, k)
且满足 i < j < k
,
使得 nums[i] < nums[j] < nums[k]
,返回 true
;
否则,返回 false
。
示例 1:
输入:nums = [1,2,3,4,5] 输出:true 解释:任何 i < j < k 的三元组都满足题意
示例 2:
输入:nums = [5,4,3,2,1] 输出:false 解释:不存在满足题意的三元组
示例 3:
输入:nums = [2,1,5,0,4,6] 输出:true 解释:三元组 (3, 4, 5) 满足题意,因为 nums[3] == 0 < nums[4] == 4 < nums[5] == 6
提示:
1 <= nums.length <= 5 * 105
-231 <= nums[i] <= 231 - 1
进阶:你能实现时间复杂度为 O(n)
,空间复杂度为 O(1)
的解决方案吗?
思路一:
暴力,使用三重循环,超时
33 / 76 个通过测试用例
var increasingTriplet = function(nums)
for (let i = 0; i < nums.length - 2;i++)
for (let j = i + 1; j < nums.length - 1;j++)
for(let k = j + 1; k < nums.length;k++)
if (nums[i]<nums[j]&&nums[j]<nums[k])
return true;
return false;
;
思路二:动态规划,参考300.最长递增子序列,超时
75 / 76 个通过测试用例
var increasingTriplet = function(numArr)
let len = numArr.length;
// 定义dp[i]: 以nums[i]结尾的最长递增子序列
// 显然子序列要包含它自己
let dp = new Array(len).fill(1);
let res = 1;
for(let i = 0; i < len; i++)
// 找到它前面比它小的元素对应的dp值+1,然后取最大
for(let j=0; j < i; j++)
if(numArr[j] < numArr[i])
dp[i] = Math.max(dp[j] + 1, dp[i]);
// 算出dp[i]后,立马更新结果
res = Math.max(res, dp[i]);
if(res >= 3)
return true;
return res >= 3;
;
思路三:贪心,第1个数和第2个数要尽可能的小
/**
* @param number[] numArr
* @return boolean
*/
var increasingTriplet = function(numArr)
let len = numArr.length;
// 两个数,不可能形成长度为3的递增子序列
if(len < 3)
return false;
let first = numArr[0];
let second = Number.MAX_VALUE;
// 贪心,第一个数 跟 第二个数 尽可能的小
for(let i = 1;i < len;i++)
let num = numArr[i];
// 如果比第二个数大,说明找到了
if(num > second)
return true;
else if(num > first)
// 如果比第二个数小,但是比第一个数大,更新第二个球
second = num;
else
// 如果比第一个数还小,更新第一个数
first = num;
return false;
;
以上是关于334. 递增的三元子序列贪心动态规划Normal的主要内容,如果未能解决你的问题,请参考以下文章