[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
这是通过递归和回溯解决的一个经典问题,使用下面的Java代码:
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
backtrack(list, new ArrayList<>(), nums, 0);
return list;
}
private void backtrack(List<List<Integer>> list , List<Integer> tempList, int [] nums, int start){
list.add(new ArrayList<>(tempList));
for(int i = start; i < nums.length; i++){
tempList.add(nums[i]);
backtrack(list, tempList, nums, i + 1);
tempList.remove(tempList.size() - 1);
}
}
func powerSubSets(nums []int){
result :=[][]int{}
tmp:=[]int{}
powerSubsetsDFS(nums,tmp, 0, result)
fmt.Println("Final Result ",result)
func powerSubsetsDFS(nums []int, tmp []int, idx int, result [][]int) {
result = append(result,tmp)
fmt.Println("result idx ",idx,result)
for i:=idx;i<len(nums);i++{
tmp = append(tmp,nums[i])
powerSubsetsDFS(nums,tmp,idx+1,result)
fmt.Println(" subract ", idx , tmp)
tmp = tmp[0:len(tmp)-1]
fmt.Println(" subract after ", idx , tmp)
}
result idx 0 [[]]
result idx 1 [[] [1]]
result idx 2 [[] [1] [1 2]]
result idx 3 [[] [1] [1 2] [1 2 3]]
subract 2 [1 2 3]
subract after 2 [1 2]
subract 1 [1 2]
subract after 1 [1]
tmp = tmp[0:len(tmp)-1]
所以,正如你提到的,问题是你使用slice的方式。Slice的大小为3个字(对于64位计算机,1个字=8字节(64位))。
第一个字指向片的第一个元素,第二个字存储片的长度,第三个字存储片的容量。您可以在这里阅读更多关于slice的内容(一篇初学者友好的文章)。
因此,正如您已经知道的,您是在对tmp中的值追加引用,而不是对TEMP中的值的副本追加引用。
tmpcpy := make([]int, len(tmp))
copy(tmpcpy, tmp)
result = append(result,tmpcpy)
我正在开发高级培养皿网络编辑器/模拟器。首先,这里有一些词汇 圆圈=位置 矩形=过渡 就地整数 = 标记 过渡状态=防护 我被困在通过过渡的守卫。守卫是一个条件,如果你想执行转换,这需要是真的。我知道我应该以某种方式使用回溯,但我不知道在程序开始之前进入过渡的位置数,所以我不能使用循环,因为我不知道我需要多少个循环。 所以,我想从第一位获取第一个令牌,从第二位获取第一令牌,然后尝试通过守卫,如果通
问题内容: 我很难弄清楚这里出了什么问题: 例如, 输出。它应该输出6,因为长度看起来像这样:5-> 16-> 8-> 4-> 2-> 1 进行一些调试后,我看到正确返回了,但是递归中出了点问题。我不太确定 谢谢你的帮助。 问题答案: 在这两个块中,进行递归调用后不会返回任何值。您需要在递归调用之前先输入,例如。如果您没有明确声明,该函数将返回。 这样可以解决此问题,但是有一种方法可以使您的代码更
我的问题是,当一个9不能正确添加时,该方法会中断。不知何故,我不知道如何让它回到前一点,并向上数,这将创建一个新的“路径”,所以我想如果我做对了,一切都应该很好。我仍然在使用递归:-/ 正如我所知,我认为Sudokurecrect()做了它应该做的事情。编辑:您可以忽略布尔测试。我知道我不使用它,我试着想一些东西,但显然我不知道如何使用它。 输出为 在那之后,不管检查哪个变体。所以问题是一样的。
我对编码还是很陌生的,我正在尝试一些稍微困难的主题,例如修改数独递归回溯程序的解决方案。最初的解决方案是针对大小为3x3的数独,我希望我的解决方案可以与正常大小的数独(9x9)一起使用。3x3解决方案在这里找到。 我觉得我对算法非常了解:对于网格中的每个列表(包含该单元格的可能值),在每一步尝试每个数字,确保电路板仍然有效,移动到下一个列表,分配一个可能的数字直到其有效,等等。如果当前电路板不正确
我目前正在编程一个递归算法解决一个佩格纸牌游戏。 算法需要使用“回溯”的方法来求解棋盘。我想我已经设法得到了一个非常接近正确的解决方案。看来我的代码正确地为所有可解板解板。它似乎也能正确地确定板何时不可解,但只有当钉住的数量不太高时。 有什么想法吗?
我正在创建一个递归导航迷宫的程序。代码: 然而,每当我到达死胡同时,它都不会回溯。当我调试时,它表明当程序从递归或“回溯”返回时,我的起始值专注于停留在我的死胡同空间。 例如: 9是我的出发点。2是我的退出。4是我的道路。1 表示墙壁。当我到达一个死胡同时(在本例中为第 7 行,第 2 列)。我的立场是等于整个程序其余部分的死胡同空间。这是为什么呢?