[3,5,0,3,4]中没有“ 132”模式吗?

时间:2019-01-26 20:44:57

标签: java if-statement while-loop

问题:给定一个由n个整数a1,a2,...,an,a组成的序列,其中132个模式是子序列ai,aj,ak,使得i

注意:n将小于15,000。

示例1:

输入:[1、2、3、4]

输出:False

说明:序列中没有132个模式。 示例2:

输入:[3,1,4,2]

输出:正确

说明:顺序为[1、4、2]的132个图案。

示例3: 输入:[-1、3、2、0]

输出:正确

说明:顺序中共有三种132种模式:[-1,3,2],[-1,3,0]和[-1,2,0]。

我的代码:

class Solution456{
public boolean find132pattern(int[] nums) {
    int i=0,j=i+1,k=j+1;
    if(nums.length<3){
        return false;
    }
    while(i<nums.length-2){
        if(nums[i]<nums[j] && nums[j]>nums[k] && nums[i] < nums[k] && nums[k] < nums[j]){
            return true;
        }
        else{
            i++;
            j++;
            k++;
        }
    }

    return false;

}
}

通过了上述所有测试用例。但是enter image description here 无法通过此测试用例。我不知道为什么对于测试用例int [] nums = {3,5,0,3,4};它无法通过。跌入132模式吗?为什么期望输出将为 true

谁能向我解释我的代码或逻辑中的错误是什么?

2 个答案:

答案 0 :(得分:2)

根据 132模式 的定义,很明显,您需要管理3个索引ijk为了遍历满足条件i < j < k的数组项的所有可能的三元组。
所以:
i可以使用从0length of the array - 2(已排除)的所有值
j可以使用从i + 1length of the array - 1(已排除)的所有值
k可以使用从j + 1length of the array(已排除)的所有值
这意味着您需要一个3级深的for循环。
您试图用一个循环来解决问题,但我认为这是不可能的。
这是我的解决方案:

public static boolean find132pattern(int[] nums) {
    if(nums.length < 3)
        return false;

    for (int i = 0; i < nums.length - 2; i++) {
        for (int j = i + 1; j < nums.length - 1; j++) {
            for (int k = j + 1; k < nums.length; k++) {
                if(nums[i] < nums[k] && nums[k] < nums[j]){
                    return true;
                }
            }
        }
    }
    return false;
} 

我测试了这些情况:

int[] array1 = {1, 2, 3, 4};
System.out.println(find132pattern(array1));

打印false

int[] array2 = {3, 1, 4, 2};
System.out.println(find132pattern(array2));

打印true

int[] array3 = {-1, 3, 2, 0};
System.out.println(find132pattern(array3));

打印true

int[] array4 = {3, 5, 0, 3, 4};
System.out.println(find132pattern(array4));

打印true

答案 1 :(得分:1)

subsequence不必是连续的。 3, 5, 4中的3, 5, 0, 3, 4是有效的132模式。您只在检查连续的子序列。