返回矩阵形式的数组子集[java]

vsmadaxz  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(345)

给定一个整数数组(长度为n),查找并返回输入数组的所有子集。所以我已经解决了这个问题,但我不确定在这里工作的基本概念。
这是正确的解决办法。

public static int[][] subsets(int input[]) {

        return subsets(input,0);
    }
    private static int[][] subsets(int input[], int index){
        if(index == input.length){
            int[][] a = new int[1][0];
            return a;
        }

        int[][] smallAns = subsets(input,index+1);
        int[][] ans = new int[2*(smallAns.length)][];

        for(int i = 0 ; i < smallAns.length ; ++i){

                ans[i] = smallAns[i];

        }
        for(int i = 0 ; i < smallAns.length ; ++i){
            ans[i+smallAns.length] = new int[smallAns[i].length+1];
        }

        for(int i = 0 ; i < smallAns.length ; ++i){
            for(int j = 0 ; j < ans[i+smallAns.length].length ; ++j){
                if(j == 0){
                    ans[i+smallAns.length][j] = input[index];
                }
                else{
                    ans[i+smallAns.length][j] = smallAns[i][j-1];
                }
            }
        }

        return ans;
    }

这是我最初的解决方案:

public static int[][] subsets(int input[]) {

        return subsets(input,0);
    }
    private static int[][] subsets(int input[], int index){
        if(index == input.length){
            int[][] a = new int[1][1];
            return a;
        }

        int[][] smallAns = subsets(input,index+1);
        int[][] ans = new int[2*(smallAns.length)][];

        for(int i = 0 ; i < smallAns.length ; ++i){

                ans[i] = smallAns[i];

        }
        for(int i = 0 ; i < smallAns.length ; ++i){
            ans[i+smallAns.length] = new int[smallAns[i].length+1];
        }

        for(int i = 0 ; i < smallAns.length ; ++i){
            for(int j = 0 ; j < ans[i+smallAns.length].length ; ++j){
                if(j == 0){
                    ans[i+smallAns.length][j] = input[index];
                }
                else{
                    ans[i+smallAns.length][j] = smallAns[i][j-1];
                }
            }
        }

        return ans;
    }

我原来的(第二个错误代码)代码在所有子集的末尾添加了0。这样地

开头给出的正确代码解决了这个问题。这两个代码之间唯一的区别是第一个基本情况返回一个1x1的矩阵(错误的),第二个基本情况返回一个1x0的矩阵(正确的),但是我很好奇在基本情况下返回一个1x0的矩阵。有人能解释一下当我试图访问列的长度时,如何不抛出nullpointerexceptions吗。

oknwwptz

oknwwptz1#

查看代码中的if语句

if(index == input.length){
            int[][] a = new int[1][1];
            return a;
}

初始化变量 a 一个二维数组(数组数组),也就是说一行一列的矩阵。自 a[0][0] 未指定任何值它为int数据类型指定了默认值 0 .
变量 a 应改为使用长度为0的数组数组进行初始化

int[][] a = new int[1][0];

相关问题