返回信息流```Java
public class Solution {
List<List<Integer>> ans=new ArrayList();
int time=0;
public List<List<Integer>> permute(int[] nums) {
List<Integer> row=new ArrayList();
int length=nums.length;
aaaa(row,nums,length);
return ans;
}
private void aaaa(List<Integer> row,int[]nums,int length){
System.out.println("time="+time++); //记录第几次运行
for(Iterator it2 = row.iterator();it2.hasNext();){
System.out.println(it2.next()); //先打出来一次
}
if(length<=0){
ans.add(new ArrayList(row));
return;
}
for(int i=0;i<nums.length&&!row.contains(nums[i]);i++){ //后来证明是这里的问题
System.out.println("i="+i);
row.add(nums[i]);
for(Iterator it2 = row.iterator();it2.hasNext();){
System.out.println(it2.next()); //加了之后再打一次
}
aaaa(row,nums,length-1);
row.remove(Integer.valueOf(nums[i]));
System.out.println("delete="+nums[i]); //删了没,删了什么也告诉我
}
}
}
```
### leetcode 46. Permutations 这次就把原代码写出来了。。不过逻辑和题都不难吧,就是要给出一个数组可能生成的各种组合(不重复)。我是搞好多次循环,要是已经有了(row.contains)就跳过。图里有log
疑问就是为啥在调用aaaa函数后,他可以直接跳到row.remove部分去删我的东西。。后来怎么改的先不说了。。也是照着别人的代码抄抄抄然后就好了
基础太差了[ema1]谢谢大家
今天还发现leetcode打太多log可能会引起submit超时不能AC,删掉log就好了[ema32]
这是一条镜像帖。来源:北邮人论坛 / java / #52323同步于 2016/8/10
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
[问题]太遗憾了。。我刷题总能遇到这种自己感觉莫名奇妙的问题
w350053002
2016/8/10镜像同步19 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
在你的这个语句里面 for(int i=0;i<nums.length&&!row.contains(nums[i]);i++), !row.contains(nums[i]) 这个是造成你每次进入aaaa的时候退出的原因。 因为每次add之后,再进入到aaaa的时候,这个语句都是包含nums[i],(因为你上一步刚add了nums[i]),所有就直接退出内循环,然后进去到delete。
按你的意思,你应该这样:
for (int i = 0; i < nums.Length; i++)
{
if(row.Contains(nums[i])) continue;
row.Add(nums[i]);
aaaa(row, nums, length - 1);
row.Remove(nums[i]);
}
就ok了
删除了 row是个引用哈,每次调用你当参数传的也是引用哈,删除的就是romove中的numsi的值…话说这里dfs还是不要对nums做修改,你可以通过if跳过nums中使用过的值
【 在 w350053002 (怀砚) 的大作中提到: 】
: [md]
: ```Java
: public class Solution {
: ...................
通过『我邮2.0』发布
permute是典型的backtracing的题目,我记得分类也是这个…permute方法中,一个ans参数保存最终结果,一个list<integer> tmp保存中间的结果,一个nums参数,一个index参数记录dfs的层数。这些参数都是比较固定的,然后每一层对nums中所有的值进行判断,看是否应该加入tmp,加入或者跳过,一层组装结束,递归进去index+1层,直到层数达到一定值,就返回。leetcode permute2这个问题考虑了包含重复元素的情况如何处理,建议在会使用递归的情况下,修改为迭代的方法解决,会加深理解…我也是上学期刷题,慢慢就会懂些的,加油
通过『我邮2.0』发布
嗯嗯。思路真是清晰哎。好好刷过就是不一样。。但是想不通为什么不用if另外判断条件。。他就可以运行到删除的部分。。这次不是他们都添加了然后引用被改,在ans中确实只添加了一次
【 在 xiaoxiaoerke (萧萧儿科) 的大作中提到: 】
: permute是典型的backtracing的题目,我记得分类也是这个…permute方法中,一个ans参数保存最终结果,一个list<integer> tmp保存中间的结果,一个nums参数,一个index参数记录dfs的层数。这些参数都是比较固定的,然后每一层对nums中所有的值进行判断,看是否应该加入tmp,加入或者跳过,一层组装结束,递归进去index+1层,直到层数达到一定值,就返回。leetcode permute2这个问题考虑了包含重复元素的情况如何处理,建议在会使用递归的情况下,修改为迭代的方法解决,会加深理解…我也是上学期刷题,慢慢就会懂些的,加油
: 通过『我邮2.0』发布
通过『我邮2.0』发布
不要对nums做修改不是很理解。。网上看别人也是专门有一个数组存储已使用过元素的下标
【 在 xiaoxiaoerke (萧萧儿科) 的大作中提到: 】
: 删除了 row是个引用哈,每次调用你当参数传的也是引用哈,删除的就是romove中的numsi的值…话说这里dfs还是不要对nums做修改,你可以通过if跳过nums中使用过的值
: 通过『我邮2.0』发布
通过『我邮2.0』发布
是的是的。。后来就是这样做出来的。。但是逻辑上确实没理解[ema1]
【 在 JeFFIry (倾城的成) 的大作中提到: 】
: 在你的这个语句里面 for(int i=0;i<nums.length&&!row.contains(nums[i]);i++), !row.contains(nums[i]) 这个是造成你每次进入aaaa的时候退出的原因。 因为每次add之后,再进入到aaaa的时候,这个语句都是包含nums[i],(因为你上一步刚add了nums[i]),所有就直接退出内循环,然后进去到delete。
: 按你的意思,你应该这样:
: for (int i = 0; i < nums.Length; i++)
: ...................
通过『我邮2.0』发布