The O(N) Increasing Triplet Subsequence Algorithm
- 时间:2020-09-24 11:41:27
- 分类:网络文摘
- 阅读:80 次
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) —
推荐阅读:童真,激荡 亡羊补牢为时已晚 数学题:用哪种方法得到的税后利息多一些 数学题:从甲袋中拿走17块巧克力,并在乙袋中放入7块巧克力 数学题:结果在距离A地占全程的五分之四处和乙车相遇 数学题:经几秒钟两人第二次相遇 数学题:妈妈买苹果和梨各用去多少钱? 求年利率的数学题 丝瓜菌菇鸡蛋汤营养美味之夏季消暑佳品 数学题:王老师平均每月要付给银行多少利息
- 评论列表
-
- 添加评论