我的思路是简历在这样一个逻辑:
1找出所有后面有比他大的数的数
这样就是两个数组成升序
2找出后面比他大的数其中第二个数是在第一步找出来的集合里面。
我的时间复杂度是n方。有点高。
import java.util.Arrays;
public class Solution {
public static void main(String args[])
{
Solution obj=new Solution();
System.out.println(obj.increasingTriplet(new int[]{5,1,5,5,2,5,4}));;
}
public boolean increasingTriplet(int[] nums) {
int record[]=new int[nums.length];
Arrays.fill(record, -1);
for(int i=nums.length-1;i>=0;i--)
{
for(int j=i+1;j<nums.length;j++)
{
if(nums[i]<nums[j])
{
record[i]=j;
break;
}
}
}
//验证
for(int i=0;i<nums.length;i++)
{
for(int j=i+1;j<nums.length;j++)
{
if(nums[i]<nums[j]&&record[j]!=-1)
{
return true;
}
}
}
return false;
}
}
大神有个线性算法
public boolean increasingTriplet(int[] nums) {
int min = Integer.MAX_VALUE;
int mid = Integer.MAX_VALUE;
for(Integer n : nums)
{
if(n < min)
{
min = n;
}
else if(n > min)
{
if(mid < n)
return true;
mid = n;
}
}
return false;
}
这个如果mid存在那么一定就是之前已经有个升序了。只要再有一个大于mid就能成立。
min用于更新mid。如果后来的mid比之前的小那么就用后来的。