Java 国际标准化组织’;没有“;132”;[3,5,0,3,4]中的模式?

Java 国际标准化组织’;没有“;132”;[3,5,0,3,4]中的模式?,java,if-statement,while-loop,Java,If Statement,While Loop,问题:给定一个由n个整数组成的序列a1,a2,…,an,a 132模式是ai,aj,ak的子序列,因此i

问题:给定一个由n个整数组成的序列a1,a2,…,an,a 132模式是ai,aj,ak的子序列,因此i 注:n将小于15000

例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;

}
}
类解决方案456{
公共布尔find132pattern(int[]nums){
int i=0,j=i+1,k=j+1;

如果(nums.lengthA不必是连续的。
3,5,4
中的
3,5,4
是一个有效的132模式。您只检查连续的子序列。

132模式的定义来看,显然需要管理3个索引
i
j
k
,以便循环通过满足条件
i
的所有可能的数组项的三元组
所以:
i
可以获取从
0
到数组长度
的所有值-2
(已排除)
j
可以从
i+1
到数组的
长度-1
(排除)
k
可以从
j+1
到数组的
长度(不包括)
这意味着您需要对
循环使用3级深度的

您试图用单个循环解决问题,但我认为这是不可能的。
因此,这是我的解决方案:

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;
} 
打印
false

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

int[] array3 = {-1, 3, 2, 0};
System.out.println(find132pattern(array3));
int[] array4 = {3, 5, 0, 3, 4};
System.out.println(find132pattern(array4));
打印
true

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

打印
true
0,1,-4
不是132序列,因为第一个值不低于最后一个值。您正在测试
nums[i]nums[k]
但是您应该测试
nums[i]
是否只检查相邻的单元格?您的程序会找到[1,3,2]在[5,1,2,3,0,2,-1]中,与Java无关,更多的是解释/数学/逻辑问题。
a
(ac)
@Andreas不能通过[3,5,0,3,4]测试用例。但您的逻辑肯定适用于其他测试用例。@请对代码进行加密,以便调试代码并找出它看不到
3,5,4
解决方案的原因。请记住,
i
j
k
不必引用相邻的值,因此在这里可以找到
i=0,j=1,k=4
的解决方案,其中检查f或
a[i]
,即
3<4<5
,是真的。我感谢你的回答。我知道如果我用三个for循环,那么它是更方便的方法。但是我想用一个while循环,用i,j,k作为计数器来实现它。我能用我的方法实现它吗?除了暴力方法还有其他方法吗?@encypher,但在你的逻辑中,
j
k
总是分开1,这是不正确的。@Andreas你写的for循环做同样的事情。@Encipher-Huh?我没有为
循环写任何
。我不是这个答案的海报。我只是向你指出,你的代码总是同时递增所有3,所以你检查
i=0,j=1,k=2,k=2,然后<代码>i=1,j=2,j=2,k=3,k=4,然后<代码>i=2,j=3,k=3,k=4然后,然后<代码>i=2,j=3,k=2,k=2,k=2,k=3,k=2,然后<代码>然后<代码>i=2,j=2,j=3,k=3,k=4和停止,停止,即3 3检查,即3与值1分开的3检查1,3检查1,k=1,k=1,k=1,k=1,k=1,k=1,k=1,k=2,k=2,k=2,k=2.3与值1,k=2,k=2,k=2,k=2,和停止,和停止,即3与1.3检查,3与1,然后
i=1,j=2,k=3
,然后
i=1,j=2,k=4
,然后
i=1,j=3,k=4
,然后
i=2,j=3,k=4
,即10次检查。@我想通过执行一次while循环来实现它,这是不可能的,因为对于i的每个n-2值,必须检查j的n-2值,并且对于j的每个n-2值,必须检查k的n-2值。是除了蛮力法还有别的方法吗?没有。每一个可能的三元组都有条件i
int[] array3 = {-1, 3, 2, 0};
System.out.println(find132pattern(array3));
int[] array4 = {3, 5, 0, 3, 4};
System.out.println(find132pattern(array4));