您的位置:首页 > 产品设计 > UI/UE

Increasing Triplet Subsequence

2016-02-27 00:54 357 查看
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
.

Analyse:

First glance at the problem, I think of brute force, time complexity is O(n^3). Time limit exceeded.

class Solution {
public:
bool increasingTriplet(vector<int>& nums) {
if(nums.size() < 3) return false;

for(int i = 0; i < nums.size() - 2; i++){
int b = i + 1;
while(nums[b] <= nums[i] && b < nums.size() - 1)
b++;
while(b + 1 < nums.size() && nums[b] >= nums[b + 1] && nums[b + 1] > nums[i])
b++;
if(b == nums.size() - 1) continue;
int c = b + 1;
while(c < nums.size() && nums[b] >= nums[c])
c++;
if(c == nums.size()) continue;
return true;
}
return false;
}
};


View Code

After all those tries, I gave a o(n) version.

class Solution {
public:
bool increasingTriplet(vector<int>& nums) {
if(nums.size() < 3) return false;

int a = INT_MAX, b = INT_MAX;
for(int i = 0; i < nums.size(); i++){
a = min(nums[i], a);
if(nums[i] > a) b = min(nums[i], b);
if(nums[i] > b) return true;
}
return false;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: