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
.
感觉是一道很简单的动规,然而还是花了很久的时间...想问自己是为什么....
思路很清晰,需要用一个一维的数组,保存到当前index之前,最长有多少位的连续上升子序列。达到3的时候就可以return了。
因为这个数组的每一个元素表示的含义是到当前下标(包含当前元素)的最长序列,所以初始化的时候都设置为1。 在遍历的过程中,只要j 比i小,就要比较 dp[j]+1 跟dp [i]谁大。
代码:
public boolean increasingTriplet(int[] nums) {
if(nums == null || nums.length <3) return false;
int [] dp = new int[nums.length];
for(int i=0;i<dp.length;i++){
dp[i] = 1;
}
for(int i=0;i<nums.length;i++){
for(int j=0;j<i;j++){
if(nums[j]<nums[i]){
dp[i] = Math.max(dp[i], dp[j]+1);
if(dp[i]>=3){
return true;
}
}
}
}
return false;
}