2 回答
TA贡献1824条经验 获得超8个赞
我可以确认您的代码在否定条件的最后一部分的情况下产生相同的结果,并且在删除条件时会产生不同的结果。
这可能看起来像一个奇迹,除非你认为整个条件在循环中被评估了很多次,并且很可能是三种情况(有条件,有否定条件,没有条件)都有不同的处理和结果的方式。我想说的是,对于条件和否定的条件,可以达到相同的结果,但以不同的方式。
这里就是这种情况。如果在循环中引入一些 printf 调试,您将看到以完全不同的方式获得结果。具有否定的现有条件允许完整条件在其他迭代中变为 true,而不是没有否定的条件。最终两者导致相同的结果纯属偶然(无需进一步研究算法)。
下面是 number 的执行跟踪、完整条件的结果以及 、 和 的中间值:inumsseenresult
无条件:
0 F [1, 1, 2] [0, 0, 0] []
0 T [1, 1, 2] [True, 0, 0] []
1 T [1, 1, 2] [True, 0, 0] []
2 F [1, 1, 2] [True, 0, 0] []
0 T [1, 1, 2] [True, 0, True] []
1 T [1, 1, 2] [True, 0, True] []
2 T [1, 1, 2] [True, 0, True] []
1 T [1, 1, 2] [False, 0, False] []
2 F [1, 1, 2] [False, 0, False] []
0 F [1, 1, 2] [False, 0, True] []
0 T [1, 1, 2] [True, 0, True] []
1 T [1, 1, 2] [True, 0, True] []
2 T [1, 1, 2] [True, 0, True] []
1 T [1, 1, 2] [False, 0, True] []
2 T [1, 1, 2] [False, 0, True] []
附带条件:seen[i-1]
0 F [1, 1, 2] [0, 0, 0] []
0 T [1, 1, 2] [True, 0, 0] []
1 T [1, 1, 2] [True, 0, 0] []
2 F [1, 1, 2] [True, 0, 0] []
0 T [1, 1, 2] [True, 0, True] []
1 T [1, 1, 2] [True, 0, True] []
2 T [1, 1, 2] [True, 0, True] []
1 F [1, 1, 2] [False, 0, False] []
0 F [1, 1, 2] [False, True, False] []
0 T [1, 1, 2] [True, True, False] []
1 T [1, 1, 2] [True, True, False] []
2 F [1, 1, 2] [True, True, False] []
1 T [1, 1, 2] [False, True, False] [[1, 1, 2]]
2 F [1, 1, 2] [False, True, False] [[1, 1, 2]]
0 F [1, 1, 2] [False, True, True] [[1, 1, 2]]
1 T [1, 1, 2] [False, True, True] [[1, 1, 2], [1, 2, 1]]
2 T [1, 1, 2] [False, True, True] [[1, 1, 2], [1, 2, 1]]
2 F [1, 1, 2] [False, False, False] [[1, 1, 2], [1, 2, 1]]
0 F [1, 1, 2] [False, False, True] [[1, 1, 2], [1, 2, 1]]
0 T [1, 1, 2] [True, False, True] [[1, 1, 2], [1, 2, 1]]
1 T [1, 1, 2] [True, False, True] [[1, 1, 2], [1, 2, 1]]
2 T [1, 1, 2] [True, False, True] [[1, 1, 2], [1, 2, 1]]
1 F [1, 1, 2] [False, False, True] [[1, 1, 2], [1, 2, 1]]
0 F [1, 1, 2] [False, True, True] [[1, 1, 2], [1, 2, 1]]
1 T [1, 1, 2] [False, True, True] [[1, 1, 2], [1, 2, 1], [2, 1, 1]]
2 T [1, 1, 2] [False, True, True] [[1, 1, 2], [1, 2, 1], [2, 1, 1]]
2 T [1, 1, 2] [False, False, True] [[1, 1, 2], [1, 2, 1], [2, 1, 1]]
而对于否定的条件:!seen[i-1]
0 F [1, 1, 2] [0, 0, 0] []
0 T [1, 1, 2] [True, 0, 0] []
1 F [1, 1, 2] [True, 0, 0] []
0 T [1, 1, 2] [True, True, 0] []
1 T [1, 1, 2] [True, True, 0] []
2 F [1, 1, 2] [True, True, 0] []
2 F [1, 1, 2] [True, False, False] [[1, 1, 2]]
0 T [1, 1, 2] [True, False, True] [[1, 1, 2]]
1 F [1, 1, 2] [True, False, True] [[1, 1, 2]]
2 T [1, 1, 2] [True, False, True] [[1, 1, 2], [1, 2, 1]]
1 T [1, 1, 2] [False, False, False] [[1, 1, 2], [1, 2, 1]]
2 F [1, 1, 2] [False, False, False] [[1, 1, 2], [1, 2, 1]]
0 F [1, 1, 2] [False, False, True] [[1, 1, 2], [1, 2, 1]]
0 T [1, 1, 2] [True, False, True] [[1, 1, 2], [1, 2, 1]]
1 F [1, 1, 2] [True, False, True] [[1, 1, 2], [1, 2, 1]]
2 T [1, 1, 2] [True, False, True] [[1, 1, 2], [1, 2, 1], [2, 1, 1]]
1 T [1, 1, 2] [False, False, True] [[1, 1, 2], [1, 2, 1], [2, 1, 1]]
2 T [1, 1, 2] [False, False, True] [[1, 1, 2], [1, 2, 1], [2, 1, 1]]
在这三种情况下,执行步骤都不同。两个(偶然)具有相同的结果。
TA贡献1847条经验 获得超11个赞
当您删除看到的 [i-1] 或 !seen[i -1] 时,对于 2 个或更多 int 数组值匹配并实现的输入类型
nums[i] == nums[i - 1]
if 条件获得 TRUE 并循环访问 int 数组,而不添加。
并且“排列.add”和“排列.remove”被按顺序调用,对于第一个/最后一个元素,导致一个空集。使用 {1,1,2} 或 {1,2,2} 或 {1,2,1} 尝试调用的序列
Add called
Add called
Remove called
Remove called
Add called
Add called
Remove called
Remove called
[]
对于 {2,2,2}
Add called
Remove called
[]
使用的代码:
for(int i = 0; i < nums.length; i++){
//System.out.println(seen[i]);
if(seen[i] || (i > 0 && nums[i] == nums[i - 1])){
//System.out.println("Inside if");
continue;
}
seen[i] = true;
System.out.println("Add called");
permutation.add(nums[i]);
backtrack(nums, permutation, seen);
seen[i] = false;
System.out.println("Remove called");
permutation.remove(permutation.size() - 1);
}
添加回答
举报