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

递增的三元子序列

  • 题目描述
    • 贪心

题目描述

难度 - 中等
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
leetcode334. 递增的三元子序列(java)_第1张图片

贪心

如果数组 nums中存在一个下标 iii 满足 1≤i

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

创建两个长度为 n 的数组 leftMin和 rightMax,对于 0≤i 数组 leftMin 的计算方式如下:

1.leftMin[0]=nums[0];
2. 从左到右遍历数组 nums\textit{nums}nums,对于1≤i 数组 rightMax的计算方式如下:
3.rightMax[n−1]=nums[n−1];
4.从右到左遍历数组 nums\textit{nums}nums,对于 0≤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;
    }

你可能感兴趣的:(算法,数据结构,java,java,开发语言,数据结构,算法,贪心算法)