leetcode_334 Increasing Triplet Subsequence

本文介绍了一种高效的方法来判断一个数组中是否存在三个数构成递增三元子序列,通过维护两个变量x1和x2来缩小搜索范围。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 题目分析:

    给定一个长度为n的乱序数组nums,求数组中是否存在i,j,k,使得num[i] < num[j] < num[k](0 <= i < j < k <= n-1)。

  • 解题思路:

    设x1为遍历到当前时的最小值,x2为遍历当前时最少有一个数比x2小的数。

    初始时,将x1与x2均设置INT_MAX,然后遍历数组,不断更新x1和x2,其更原则为:

    1)若nums[i] <= x1,则x1 = nums[i];

    2)若x1 < num[i] <= x2,则x2 = nums[i]

    3)nums[i] < x2,说明有解,返回true即可。

    实质:不断缩小x1和x2,看是否存在第3个大于x2,存在,则为答案。

  • 实现程序

    • C++版本

      class Solution
      {
          public:
              bool increasingTriplet(vector<int> &nums)
              {
                  int x1 = 0x7fffffff;
                  int x2 = 0x7fffffff;
                  for (int i = 0; i < nums.size(); i++)
                  {
                      if (nums[i] <= x1)
                          x1 = nums[i];
                      else if (nums[i] <= x2)
                          x2 = nums[i];
                      else 
                          return true;
                  }
                  return false;
              }
      };
      
    • Java版本

      public boolean increasingTriplet(int[] nums){
          int x1 = 0x7fffffff;
          int x2 = 0x7fffffff;
          for (int i = 0; i < nums.length; i++)
          {   
              if (nums[i] <= x1){
                  // 记录遍历到当前时,出现的最小元素
                  x1 = nums[i];
              } else if (nums[i] <= x2) {
                  // 记录遍历到当前,出现的第二小的元素
                  x2 = nums[i];
              }
              else {
                  return true;
              }
          }
          return false;
      }
      
  • 参考文献

    https://www.hrwhisper.me/leetcode-increasing-triplet-subsequence/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值