# 334. 递增的三元子序列 - LeetCode Python/Java/C++/JS/C#/Go/Ruby 题解
访问原文链接:[334. 递增的三元子序列 - LeetCode Python/Java/C++/JS/C#/Go/Ruby 题解](https://leetcode.blog/zh/leetcode/334-increasing-triplet-subsequence),体验更佳!
力扣链接:[334. 递增的三元子序列](https://leetcode.cn/problems/increasing-triplet-subsequence), 难度等级:**中等**。
## LeetCode “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
### [约束]
- `1 <= nums.length <= 5 * 10^5`
- `-2^31 <= nums[i] <= 2^31 - 1`
进阶:你能实现时间复杂度为 `O(n)` ,空间复杂度为 `O(1)` 的解决方案吗?
## 思路
要找到一个递增的三元子序列,我们可以追踪当前遇到的最小值和第二小的值。当遇到比这两个值都大的数时,就找到了满足条件的三元组。
## “贪心算法”的模式
“贪心算法”是在每一步中都采取当前状态下最优的决策,从而希望导致“全局最优”的算法策略。即“局部最优”能导致“全局最优”。
## 步骤
1. 初始化:将`first`设为数组第一个元素,`second`设为最大整数值
2. 从第二个元素开始遍历数组:
- 如果当前数字 > `second`:找到三元组,直接返回`true`
- 如果当前数字 > `first`:将`second`更新为当前数字
- 否则:将`first`更新为当前数字(保持记录最小值)
3. 遍历结束后仍未找到则返回`false`
## 复杂度
- 时间复杂度: `O(N)`.
- 空间复杂度: `O(1)`.
## Python
```python
class Solution:
def increasingTriplet(self, nums: List[int]) -> bool:
first = nums[0]
second = float('inf')
for i in range(1, len(nums)):
if nums[i] > second:
return True
if nums[i] > first:
second = nums[i]
else:
first = nums[i]
return False
```
## Java
```java
class Solution {
public boolean increasingTriplet(int[] nums) {
int first = nums[0];
int second = Integer.MAX_VALUE;
for (int i = 1; i < nums.length; i++) {
if (nums[i] > second) {
return true;
}
if (nums[i] > first) {
second = nums[i];
} else {
first = nums[i];
}
}
return false;
}
}
```
## C++
```cpp
class Solution {
public:
bool increasingTriplet(vector& nums) {
int first = nums[0];
int second = INT_MAX;
for (int i = 1; i < nums.size(); i++) {
if (nums[i] > second) {
return true;
}
if (nums[i] > first) {
second = nums[i];
} else {
first = nums[i];
}
}
return false;
}
};
```
## JavaScript
```javascript
/**
* @param {number[]} nums
* @return {boolean}
*/
var increasingTriplet = function (nums) {
let first = nums[0]
let second = Infinity
for (let i = 1; i < nums.length; i++) {
if (nums[i] > second) {
return true
}
if (nums[i] > first) {
second = nums[i]
} else {
first = nums[i]
}
}
return false
};
```
## C#
```csharp
public class Solution {
public bool IncreasingTriplet(int[] nums) {
int first = nums[0];
int second = int.MaxValue;
for (int i = 1; i < nums.Length; i++) {
if (nums[i] > second) {
return true;
}
if (nums[i] > first) {
second = nums[i];
} else {
first = nums[i];
}
}
return false;
}
}
```
## Go
```go
func increasingTriplet(nums []int) bool {
first := nums[0]
second := math.MaxInt32
for _, num := range nums[1:] {
if num > second {
return true
}
if num > first {
second = num
} else {
first = num
}
}
return false
}
```
## Ruby
```ruby
# @param {Integer[]} nums
# @return {Boolean}
def increasing_triplet(nums)
first = nums[0]
second = Float::INFINITY
nums[1..].each do |num|
if num > second
return true
end
if num > first
second = num
else
first = num
end
end
false
end
```
## Other languages
```java
// Welcome to create a PR to complete the code of this language, thanks!
```
亲爱的力扣人,为了您更好的刷题体验,请访问 [LeetCode.blog](https://leetcode.blog/zh)。
本站敢称力扣题解最佳实践,终将省你大量刷题时间!
原文链接:[334. 递增的三元子序列 - LeetCode Python/Java/C++/JS/C#/Go/Ruby 题解](https://leetcode.blog/zh/leetcode/334-increasing-triplet-subsequence).
GitHub 仓库: [leetcode-python-java](https://github.com/leetcode-python-java/leetcode-python-java).