回溯法6,不走寻常路,用回溯法来解4Sum问题
一.介绍
回溯法不是这个题的标准答案和最优解法,主要是理解回溯法的思路
问题描述
输入 (这里的A,B,C,D可以是任意长度的数组)
A = [ 1, 2] B = [-2,-1] C = [-1, 2] D = [ 0, 2]
求使 A[i] + B[j] + C[k] + D[l] = 0 的解的个数
其实这题都可以看成一个组合问题,从A,B,C,D中任意取一个数,组成4个数的组合,并且这4个数为0,的个数
既然可以看做组合问题,那么就可以用回溯法来解了。
二.代码实现
public class Solution { public static void main(String[] args) { int[] a1 = new int[]{1,2}; int[] b1 = new int[]{-2,-1}; int[] c1 = new int[]{-1,2}; int[] d1 = new int[]{0,2}; System.out.println(fourSumCount(a1,b1,c1,d1)); } public static int fourSumCount(int[] A, int[] B, int[] C, int[] D) { int[] count = new int[1]; backTrace(A,B,C,D,0,0,count); return count[0]; } private static void backTrace(int[] A, int[] B, int[] C, int[] D,int pos,int sum,int[] count){ if(pos==4){ if(sum==0){ count[0]++; } return; } int [] cur = null; int j = pos; switch (j){ case 0: cur = A; break; case 1: cur = B; break; case 2: cur = C; break; case 3: cur = D; break; } if(cur==null||cur.length==0){ return; } for (int i = 0; i < cur.length; i++) { sum+=cur[i]; backTrace(A,B,C,D,pos+1,sum,count); sum-=cur[i]; } } }
输出:2
三.图解分析
四.总结分析
for (int i = 0; i < cur.length; i++) {
sum+=cur[i];
backTrace(A,B,C,D,pos+1,sum,count);
sum-=cur[i];
}
这里是关键,把当前层的值加入sum,然后往下层递归
是不是咋一看就是一个 N叉树 的前序遍历啊
然后设置好退出条件
if(pos==4){
if(sum==0){
count[0]++;
}
return;
}