Java 为什么3和算法只查看特定数字右侧的子数组?
我正在看一段代码,它通过构建2sum解决方案来解决3sum问题。为什么低应该是Java 为什么3和算法只查看特定数字右侧的子数组?,java,arrays,algorithm,sorting,Java,Arrays,Algorithm,Sorting,我正在看一段代码,它通过构建2sum解决方案来解决3sum问题。为什么低应该是intlo=index+1?这是否意味着当我们观察子阵列时,我们只对目标右侧的数字之和感兴趣?目标左边的数字是多少 类解决方案{ 公共列表三和(int[]nums){ if(nums==null | | nums.length
intlo=index+1
?这是否意味着当我们观察子阵列时,我们只对目标右侧的数字之和感兴趣?目标左边的数字是多少
类解决方案{
公共列表三和(int[]nums){
if(nums==null | | nums.length<2){
返回新的ArrayList();
}
列表结果=新建ArrayList();
数组。排序(nums);
对于(int i=0;i,因为对于位于i
位置的每个数字num[i]
,您可以在数组[i+1…N]
上使用2-sum算法来查找两个数字,使它们的和等于-num[i]
,这意味着3个数字的和为0
例如
让数组为[-1,0,1,2,-1,-4]
该算法将发现[0,1,2,-1,-4]
中的任何2-和等于1
然后它会发现[1,2,-1,-4]
中的任何2-和等于0
等等
现在,在搜索num[i]
的2-和时,可以看到子数组的起点是i+1
,这就是为什么int lo=index+1
搜索是穷举的,所以所有和等于0
的元组都会被找到。因为目标在目标左边的任何数字的右边。结果。addAll(twoSum(nums,i))
…为什么他们要将i+1传递给这个方法,i左边的数字呢?想象数组是{A,B,C,D}
其中每个字母代表一个数字。所以当threeSum
到达a时,它将询问twoSum
a是否与B+C
或B+D
一起工作。现在当threeSum
到达B时,我们是否关心a?不!我们已经检查了B是否与a一起工作。这正是我遇到的问题。为什么我们不关心a关于A?是否存在A+C=B的组合?如果不是,原因是什么?哦,3和问题的要点是找到任何三个加起来等于零的数字,即A+B+C=0
。注意目标是-nums[index]
。因此,您正在查找与A+B+C=0
相同的-A=B+C
。然后您将查找-B=A+C
,这也是A+B+C=0