ningendo

回溯法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;
}
 

 

  

posted on 2020-11-29 17:28  Lunamonna  阅读(85)  评论(0编辑  收藏  举报

导航