【LeetCode每日一题】——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

六【解题思路】

  • 利用贪心的思想,定义 f i r s t first first s e c o n d second second分别表示递增子序列中的前两个值,需要注意此递增子序列不一定是连续的递增子序列,对于数组中的任意值 x x x,此时有三种情况:
    • x < = f i r s t x<=first x<=first,此时将 f i r s t first first更新为 x x x,因为值越小,就越容易找到递增子序列,也是为下一次寻找递增子序列做准备
    • f i r s t < = x < = s e c o n d first<=x<=second first<=x<=second,此时将 s e c o n d second second更新为 x x x,因为值越小,越容易找到递增子序列,也是为下一次寻找递增子序列做准备
    • x > s e c o n d x>second x>second,说明此时的 x x x不仅大于 s e c o n d second second,同时也大于 f i r s t first first,那么此时就找到一个递增子序列了,返回 t r u e true true即可
  • 否则返回 f a l s e false false

七【题目提示】

  • 1 < = n u m s . l e n g t h < = 5 ∗ 1 0 5 1 <= nums.length <= 5 * 10^5 1<=nums.length<=5105
  • − 2 31 < = n u m s [ i ] < = 2 31 − 1 -2^{31} <= nums[i] <= 2^{31} - 1 231<=nums[i]<=2311

八【题目进阶】

  • 你能实现时间复杂度为 O ( n ) O(n) O(n) ,空间复杂度为 O ( 1 ) O(1) O(1) 的解决方案吗?

九【时间频度】

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n为传入数组的长度
  • 空间复杂度: O ( 1 ) O(1) O(1)

十【代码实现】

  1. Java语言版
class Solution {
    
    
    public boolean increasingTriplet(int[] nums) {
    
    
        int first = Integer.MAX_VALUE;
        int second = Integer.MAX_VALUE;
        for(int i = 0;i<nums.length;i++){
    
    
            if(nums[i] <= first){
    
    
                first = nums[i];
            }else if(nums[i] <= second){
    
    
                second = nums[i];
            }else{
    
    
                return true;
            }
        }
        return false;
    }
}
  1. C语言版
bool increasingTriplet(int* nums, int numsSize)
{
    
    
    int first = INT_MAX;
    int second = INT_MAX;
    for(int i = 0;i<numsSize;i++)
    {
    
    
        if(nums[i] <= first)
        {
    
    
            first = nums[i];
        }
        else if(nums[i] <= second)
        {
    
    
            second = nums[i];
        }
        else
        {
    
    
            return true;
        }
    }
    return false;
}
  1. Python版
class Solution:
    def increasingTriplet(self, nums: List[int]) -> bool:
        first = float('inf')
        second = float('inf')
        for i in range(0,len(nums)):
            if nums[i] <= first:
                first = nums[i]
            elif nums[i] <= second:
                second = nums[i]
            else:
                return True
        return False

十一【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. C语言版
    在这里插入图片描述

  3. Python语言版
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/IronmanJay/article/details/129382502