我正在解决以下问题:
Given an unsorted array return whether an increasing subsequence of length 3 exists in the array or not. Formally return true if there exists i, j, k such that:
arr[i]<arr[j]<arr[k] given 0 <= i < j < k <= n-1
这是我的代码:
public boolean increasingTriplet(int[] nums) {
if (nums.length < 3) return false;
for (int i = 0; i < nums.length-2; i++) {
if (nums[i] < nums[i+1]) {
if (nums[i+1] < nums[i+2]) return true;
}
}
return false;
}
我的代码在以下输入中失败:
[5,1,5,5,2,5,4]
显然,对于此序列,我的代码应该返回true,但是由于我看不到长度3的任何增加的子序列,因此我一生都无法弄清楚原因,我们将不胜感激。
答案 0 :(得分:0)
public boolean increasingTriplet(int[] nums) {
int first=Integer.MAX_VALUE;
int second=Integer.MAX_VALUE;
int third=Integer.MAX_VALUE;
for(int p=0; i<nums.length; p++){
if(nums[p]<=third){
third=nums[p];
}else{
if(nums[p]<=second){
first=third;
second=nums[p];
}else{
return true;
}
}
}
return false;
}
此代码背后的整个想法是,如果我们发现一对值按升序排列,则只有在新对的第一个值小于值对的新值对时,才能用新的对数递增序列替换该对。旧对和新对的第二个值小于旧对的第二个值。同时,我们检查该数字是否大于将完成序列的第二个数字(在这种情况下,我们将返回true
)。
代码开始将值从第三到第二而不是第一到第二进行比较,但是思想与上面相同。
答案 1 :(得分:-1)
这是一种可能的解决方案:
public static boolean increasingTriplet(int[] nums) {
for (int i = 0; i < nums.length-2; ++i) {
for (int j = i+1; j < nums.length-1; ++j) {
if (nums[j] > nums[i]) {
for (int k = j+1; k < nums.length; ++k) {
if (nums[k] > nums[j]) {
return true;
}
}
}
}
}
return false;
}