Java 国际标准化组织’;没有“;132”;[3,5,0,3,4]中的模式?
问题:给定一个由n个整数组成的序列a1,a2,…,an,a 132模式是ai,aj,ak的子序列,因此iJava 国际标准化组织’;没有“;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
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));