问题描述:
Given an unsorted array return whether an increasing sub sequence 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] given0 ≤ i < j < k ≤ n-1else return false.
Your algorithm should run in O(n) time complexity and O(1) space complexity.
(1)问题分析:
对于给定的一个无序数组,任意两个连续数字是递增的或者递减的,如下图所示:
如果存在i<j<k使得arr[i]<arr[j]<arr[k] 那么其一定可以拆分成两个连续递增的序列
即:可以有两个连续递增的序列来找到所需的的递增三序列。
所以只需迭代找到二递增序列,来判断是否能组成一个三递增序列
2根据分析写出判别条件
temp数组表示前面一个二递增序列,nums[index]表示后一个二递增序列,如果满足:
nums[index]>temp[1]||nums[index+1]>temp[1]||nums[index]>temp[0]
那么 可以构造出一个三递增序列
3完成代码:
public class Solution {
public boolean increasingTriplet(int[] nums) {
int[] temp=new int[2];
int index=getnext(nums,0);
if(index==-1){
return false;
}
temp[0]=nums[index];
temp[1]=nums[index+1];
index=getnext(nums,index+1);
while(index!=-1){
if(nums[index]>temp[1]||nums[index+1]>temp[1]||nums[index]>temp[0]){
return true;
}
// update the temp;
temp[0]=nums[index];
temp[1]=nums[index+1];
index=getnext(nums,index+1);
}
return false;
}
private int getnext(int[] nums,int index){
for(int i=index;i<nums.length-1;i++){
if(nums[i]<nums[i+1]){
return i;
}
}
return -1;
}
}