leetcode334. 递增的三元子序列(java)

265 篇文章 2 订阅
235 篇文章 0 订阅
文章讲述了如何通过贪心算法判断给定整数数组是否存在长度为3的递增子序列,通过维护每个元素的左边最小值和右边最大值来简化问题。给出一个简单的Java代码实现作为示例。
摘要由CSDN通过智能技术生成

递增的三元子序列

题目描述

难度 - 中等
leetcode334. 递增的三元子序列

给你一个整数数组 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 * 10^5
-231 <= nums[i] <= 2^31 - 1
在这里插入图片描述

贪心

如果数组 nums中存在一个下标 iii 满足 1≤i<n−1,使得在 nums[i] 的左边存在一个元素小于 nums[i]且在 nums[i] 的右边存在一个元素大于 nums[i],则数组 nums 中存在递增的三元子序列。

在 nums[i] 的左边存在一个元素小于 nums[i] 等价于在 nums[i] 的左边的最小元素小于 nums[i],在 nums[i] 的右边存在一个元素大于 nums[i] 等价于在 nums[i] 的右边的最大元素大于 nums[i],因此可以维护数组 nums 中的每个元素左边的最小值和右边的最大值。

创建两个长度为 n 的数组 leftMin和 rightMax,对于 0≤i<n,leftMin[i]表示 nums[0]到 nums[i]中的最小值,rightMax[i] 表示 nums[i] 到 nums[n−1]中的最大值。
数组 leftMin 的计算方式如下:

1.leftMin[0]=nums[0];
2. 从左到右遍历数组 nums\textit{nums}nums,对于1≤i<n,leftMin[i]=min⁡(leftMin[i−1],nums[i])。
数组 rightMax的计算方式如下:
3.rightMax[n−1]=nums[n−1];
4.从右到左遍历数组 nums\textit{nums}nums,对于 0≤i<n−10 \le i < n - 10≤i<n−1,rightMax[i]=max⁡(rightMax[i+1],nums[i])。

代码演示:

    public boolean increasingTriplet(int[] nums) {
        if(nums.length < 3){
            return false;
        }
        int first = nums[0];
        int second = Integer.MAX_VALUE;
        for(int i = 0; i < nums.length;i++){
            int num = nums[i];
            if(num > second){
                return true;
            }else if(num > first){
                second = num;
            }else{
                first = num;
            }
        }
      
       return false;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值