LeetCode刷题实战334:递增的三元子序列
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.
示例
示例 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;
}
};
LeetCode刷题实战325:和等于 k 的最长子数组长度