注意: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;
}
}
通过了上述所有测试用例。但是 无法通过此测试用例。我不知道为什么对于测试用例int [] nums = {3,5,0,3,4};它无法通过。跌入132模式吗?为什么期望输出将为 true ?
谁能向我解释我的代码或逻辑中的错误是什么?
答案 0 :(得分:2)
根据 132模式 的定义,很明显,您需要管理3个索引i
,j
和k
为了遍历满足条件i < j < k
的数组项的所有可能的三元组。
所以:
i
可以使用从0
到length of the array - 2
(已排除)的所有值
j
可以使用从i + 1
到length of the array - 1
(已排除)的所有值
k
可以使用从j + 1
到length 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模式。您只在检查连续的子序列。