BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #52323同步于 2016/8/10
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

[问题]太遗憾了。。我刷题总能遇到这种自己感觉莫名奇妙的问题

w350053002
2016/8/10镜像同步19 回复
```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]
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
nuanyangyang机器人#1 · 2016/8/10
用Python的itertools.permutations搞一炮?
JeFFIry机器人#2 · 2016/8/10
在你的这个语句里面 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了
ssw940521机器人#3 · 2016/8/10
室长卧槽 发自「贵邮」
huliang2016机器人#4 · 2016/8/10
dfs?
xiaoxiaoerke机器人#5 · 2016/8/11
删除了 row是个引用哈,每次调用你当参数传的也是引用哈,删除的就是romove中的numsi的值…话说这里dfs还是不要对nums做修改,你可以通过if跳过nums中使用过的值 【 在 w350053002 (怀砚) 的大作中提到: 】 : [md] : ```Java : public class Solution { : ................... 通过『我邮2.0』发布
xiaoxiaoerke机器人#6 · 2016/8/11
permute是典型的backtracing的题目,我记得分类也是这个…permute方法中,一个ans参数保存最终结果,一个list<integer> tmp保存中间的结果,一个nums参数,一个index参数记录dfs的层数。这些参数都是比较固定的,然后每一层对nums中所有的值进行判断,看是否应该加入tmp,加入或者跳过,一层组装结束,递归进去index+1层,直到层数达到一定值,就返回。leetcode permute2这个问题考虑了包含重复元素的情况如何处理,建议在会使用递归的情况下,修改为迭代的方法解决,会加深理解…我也是上学期刷题,慢慢就会懂些的,加油 通过『我邮2.0』发布
w350053002机器人#7 · 2016/8/11
嗯嗯。思路真是清晰哎。好好刷过就是不一样。。但是想不通为什么不用if另外判断条件。。他就可以运行到删除的部分。。这次不是他们都添加了然后引用被改,在ans中确实只添加了一次 【 在 xiaoxiaoerke (萧萧儿科) 的大作中提到: 】 : permute是典型的backtracing的题目,我记得分类也是这个…permute方法中,一个ans参数保存最终结果,一个list<integer> tmp保存中间的结果,一个nums参数,一个index参数记录dfs的层数。这些参数都是比较固定的,然后每一层对nums中所有的值进行判断,看是否应该加入tmp,加入或者跳过,一层组装结束,递归进去index+1层,直到层数达到一定值,就返回。leetcode permute2这个问题考虑了包含重复元素的情况如何处理,建议在会使用递归的情况下,修改为迭代的方法解决,会加深理解…我也是上学期刷题,慢慢就会懂些的,加油 : 通过『我邮2.0』发布 通过『我邮2.0』发布
w350053002机器人#8 · 2016/8/11
不要对nums做修改不是很理解。。网上看别人也是专门有一个数组存储已使用过元素的下标 【 在 xiaoxiaoerke (萧萧儿科) 的大作中提到: 】 : 删除了 row是个引用哈,每次调用你当参数传的也是引用哈,删除的就是romove中的numsi的值…话说这里dfs还是不要对nums做修改,你可以通过if跳过nums中使用过的值 : 通过『我邮2.0』发布 通过『我邮2.0』发布
w350053002机器人#9 · 2016/8/11
是的是的。。后来就是这样做出来的。。但是逻辑上确实没理解[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』发布