The O(N) Increasing Triplet Subsequence Algorithm
- 时间:2020-09-24 11:41:27
- 分类:网络文摘
- 阅读:143 次
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.
Note: Your algorithm should run in O(n) time complexity and O(1) space complexity.Example 1:
Input: [1,2,3,4,5]
Output: true
Example 2:Input: [5,4,3,2,1]
Output: false
Checking Increasing Triplet Subsequence in O(N) Algorithm
The most intutive solution will be to bruteforce a triplet in O(N^3) and see if it is in increasing order. Obviously, this is inefficient. A Better solution is to record the smaller numbers as iterating the array.
This greedy approach works, as we are iterating the array from left to the right. If we find out a number that is different than the two numbers we have found – and both numbers are smaller than the current number, we know it has a increasing triplet subsequence.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class Solution { public: bool increasingTriplet(vector<int>& nums) { int first = INT_MAX, second = INT_MAX; for (const auto &n: nums) { if (n <= first) { first = n; } else if (n <= second) { second = n; } else return true; } return false; // can't find such triplet increasing subsequence } }; |
class Solution {
public:
bool increasingTriplet(vector<int>& nums) {
int first = INT_MAX, second = INT_MAX;
for (const auto &n: nums) {
if (n <= first) {
first = n;
} else if (n <= second) {
second = n;
} else return true;
}
return false; // can't find such triplet increasing subsequence
}
};I have to say, this trick is elegant and makes the algorithm efficient in O(N) time and O(1) constant space.
–EOF (The Ultimate Computing & Technology Blog) —
推荐阅读:冬季预防食物中毒及中毒后急救措施 四种常见的食物可以排出身体毒素 男人多吃一些香蕉对身体大有好处 冬至时节常吃6种传统食物可补阳防寒 南方黑芝麻糊大肠菌群超标 5批次产品不合格 烹饪技巧之烹调鸡蛋过程中的常见错误 全新认识冬季当家菜大白菜的营养价值 那些被人们误传的补充某种营养的食物 阿胶产品乱象:原料中被混入骡皮马皮 时令水果橘子橙子柚子营养价值大比拼
- 评论列表
-
- 添加评论