栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Leetcode--Java--334. 递增的三元子序列

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Leetcode--Java--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
解释:不存在满足题意的三元组

思路

贪心 + 二分优化版 + 分类讨论

  1. 在枚举过程中维护长度为2的递增序列,只要能存在长度为3的递增序列就成功。有点类似于维护一个单调队列,每次首先判断与队尾元素的大小关系。
  2. 维护时,根据当前数和最小以及末尾数的关系,比末尾数大就直接加入到后面,否则分情况考虑:因为只要找到3就成功。所以只考虑长度为1或者2的情况。进行比较,小于最小的数,就更新最小的数,否则就更新末尾的数。
  3. 该题目是AcWing之LC300二分法版本的简化版,不需要真正去二分,只考虑长度为2的直接判断即可。
  4. linkedList设置某个index的数为num,直接用set(index, num)
代码
class Solution {
    public boolean increasingTriplet(int[] nums) {
      linkedList l = new linkedList<>();
      for (int num: nums) {
        //空的话或者当前元素比末尾元素大就加入
          if (l.isEmpty() || num > l.peekLast()) {
               l.add(num);
               if (l.size() == 3) return true;
          }
          else {
              //分情况考虑,长度为1/2
              if (l.size() == 1){
                  l.set(0, num);
              }else if (l.size() == 2) {
                  //如果比最小的小,就更新最小(反正对结果序列没影响,因为核心是末尾元素)
                 if (num < l.get(0)) {
                     l.set(0, num);
                 }  //大于最小,由前面小于末尾,所以就成为新的末尾 
                 else if (num > l.get(0)) {
                      l.set(1, num);
                 }
              }
          }
      }
      return false;
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/658270.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号