240531 力扣 334. 递增的三元子序列

题目

334. 递增的三元子序列

给你一个整数数组 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) 的解决方案吗?

解题思路

最开始没看清思路,以为是要连续三个递增数字,实际上三个数字是可以间隔的。

思路一:找到每个数字左边最小数字和右边最大数字,如果该数字大于左边最小,小于右边最大,则符合题意。通过双指针得到两个数组,leftmin和rightmax。可是这种情况下无法达到空间复杂度O(1)。

思路二:三个数字如果分别为first、second、third,则是first<second<third。因此将first初始值设置为数组第一个数,第二第三个数设置为无穷大。遍历数组,如果检测到的数大于第三个数,那么third=该数,如果该数大于第一个数,那么second=该数,小于第一个数那就将该数设置为first。此时符合进阶要求。

代码

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

扩展

java里最大整数为Integer.MAX_VALUE也就是2^{32}

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值