本文主要是介绍Java中等题-递增的三元子序列(力扣),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
你一个整数数组 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
这道题我的思路是用一个数组f[i]记录i之前有多少个比它小的数。但是这样做会超时 。
官方的思路是:用一个数组leftmin[i]表示在i之前(包括i)最小的数;
用一个数组rightmax[i]表示在i之后(包括i)最大的数。
然后遍历一次,只要满足 leftmin[i-1]<nums[i]<rightmax[i+1]即可返回true
class Solution {public boolean increasingTriplet(int[] nums) {int n=nums.length;if(n<3){return false;}int leftmin[]=new int[n];int rightmax[]=new int[n];leftmin[0]=nums[0];rightmax[n-1]=nums[n-1];for(int i=1;i<n;i++){leftmin[i]=Math.min(leftmin[i-1],nums[i]);}for(int j=n-2;j>=0;j--){rightmax[j]=Math.max(nums[j],rightmax[j+1]);}for(int i=1;i<n-1;i++){if(leftmin[i-1]<nums[i]&&rightmax[i+1]>nums[i]){return true;}}return false;}
}
这篇关于Java中等题-递增的三元子序列(力扣)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!