一【题目类别】
- 贪心算法
二【题目难度】
- 中等
三【题目编号】
- 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<=5∗105
- − 2 31 < = n u m s [ i ] < = 2 31 − 1 -2^{31} <= nums[i] <= 2^{31} - 1 −231<=nums[i]<=231−1
八【题目进阶】
- 你能实现时间复杂度为 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)
十【代码实现】
- 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;
}
}
- 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;
}
- 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
十一【提交结果】
-
Java语言版
-
C语言版
-
Python语言版