334. Increasing Triplet Subsequence
连续递增的长度为3的子序列,
解法一:dp数组,分别记录当前位置的最大和最小数。时间复杂度O(n)。空间复杂度O(n).
class Solution {
public boolean increasingTriplet(int[] nums) {
if(nums.length<3)
return false;
int mindp[]=new int[nums.length];
mindp[0]=nums[0];
int tempmin=nums[0];
for(int i=1;i<nums.length;i++){
tempmin=Math.min(tempmin,nums[i-1]);
mindp[i]=tempmin;
}
int maxdp[]=new int[nums.length];
maxdp[nums.length-1]=nums[nums.length-1];
int tempmax=nums[nums.length-1];
for(int i=nums.length-2;i>=0;i--){
tempmax=Math.max(tempmax,nums[i+1]);
maxdp[i]=tempmax;
}
for(int i=1;i<nums.length-1;i++){
if(nums[i]>mindp[i] && nums[i]<maxdp[i])
return true;
}
return false;
}
}
解法二:dp动态规划,时间复杂度O(n2),空间复杂度O(1).dp[i]=max(dp[i],dp[j]+1),nums[j]<nums[i],j<i.
class Solution {
public boolean increasingTriplet(int[] nums) {
int dp[]=new int[nums.length];
for(int i=0;i<nums.length;i++)
dp[i]=1;
for(int i=1;i<nums.length;i++){
for(int j=0;j<i;j++){
if(nums[i]>nums[j]){
dp[i]=Math.max(dp[j]+1,dp[i]);
if(dp[i]==3)
return true;
}
}
}
return false;
}
}
解法三:找出两个数,分别记录为次小和最小,当一个数 比这两个数都大时,返回true.
class Solution {
public boolean increasingTriplet(int[] nums) {
int One=Integer.MAX_VALUE,Tow=Integer.MAX_VALUE;
for(int i=0;i< nums.length;i++){
if(nums[i]<=One)
One=nums[i];
else if(nums[i]<=Tow)
Tow=nums[i];
else
return true;
}
return false;
}
}