题目:
Given an unsorted array return whether an increasing subsequence of length 3 exists or not in the array.
Formally the function should:
Return true if there exists i, j, k
such that arr[i] < arr[j] < arr[k] given 0 ≤ i < j < k ≤ n-1 else return false.
Your algorithm should run in O(n) time complexity and O(1) space complexity.
Examples:
Given [1, 2, 3, 4, 5]
,
return true
.
Given [5, 4, 3, 2, 1]
,
return false
.
思路:
只要我们找到一个递增三元组,就可以返回true。因此我们在遍历的过程中,可以将搜索的过程分为两个阶段:
1)还没有找到递增二元组:如果当前元素小于small,则更新small为当前元素;如果当前元素大于small,则此时已经找到了递增二元组,给middle赋值。
2)已经找到了递增二元组:如果当前元素小于small,则更新small;否则如果介于small和和middle之间,则更新middle;否则说明已经找到了递增三元组,返回true。
如果遍历完所有元素后仍然没有找到递增三元组,则说明不存在递增三元组,返回false。算法的时间复杂度是O(n),空间复杂度是O(1)。
代码:
class Solution {
public:
bool increasingTriplet(vector<int>& nums) {
if(nums.size() < 3) {
return false;
}
int small = nums[0], middle = INT_MAX;
bool has_middle = false;
for(int i = 1; i < nums.size(); ++i) {
if(!has_middle) { // try to find the middle element
if(nums[i] > small) {
middle = nums[i];
has_middle = true;
}
else {
small = nums[i];
}
}
else { // try to find the largest element
if(nums[i] < small) {
small = nums[i];
}
else if(nums[i] < middle && nums[i] > small) { // make sure small is not equal to middle
middle = nums[i];
}
else if(nums[i] > middle) {
return true;
}
}
}
return false;
}
};