给定一个整数数组(长度为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吗。
1条答案
按热度按时间oknwwptz1#
查看代码中的if语句
初始化变量
a
一个二维数组(数组数组),也就是说一行一列的矩阵。自a[0][0]
未指定任何值它为int数据类型指定了默认值0
.变量
a
应改为使用长度为0的数组数组进行初始化