今天和大家聊的问题叫做 递增的三元子序列,我们先来看题面:https://leetcode-cn.com/problems/increasing-triplet-subsequence/
Given an integer array nums, return true if there exists a triple of indices (i, j, k) such that i < j < k and nums[i] < nums[j] < nums[k]. If no such indices exists, return false.
给你一个整数数组 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
解题
用a、b、c来表示三元子序列的三个元素:其中用c来遍历数组,用a来始终记录最小的元素,用b来记录子序列中最大的元素。然后再遍历的时候,不断地更新a,同时也要保证b尽可能地小,如果遍历到的元素c大于a同时也大于b的话,表示找到三元组了,返回true。
class Solution { public: bool increasingTriplet(vector<int>& nums) { if(nums.size()<3)return false; //用a始终记录最小的元素,b为子序列中第二大的元素 int a=INT_MAX,b=INT_MAX; //然后不断更新a,同时保持b尽可能的小。如果下一个元素比b大证明找到了三元组 for(const auto c:nums){ if(c<=a)a=c; //c小于等于a,a更新为新出现的较小值 else if(c<=b)b=c; //c大于a同时c小于等于b,b更新为大于a的较小值 else return true; //c大于a同时也大于b,证明找到三元组了 } return false; } };
好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。