一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 445|回复: 4
收起左侧

[Leetcode] Permutations里的小问题

[复制链接] |试试Instant~ |关注本帖
nathanma 发表于 2014-12-11 10:18:37 | 显示全部楼层 |阅读模式

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
在做Permutations这题时,遇到了一个小问题,想不明白发出来问问。。
code:

public class Solution {
    ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
    ArrayList<Integer> item = new ArrayList<Integer>();

    public ArrayList<ArrayList<Integer>> permute(int[] num) {
        if(num.length==0||num==null)
            return res;
        boolean[] visited = new boolean[num.length];  
        permutation_helper(num,visited);
        return res;
    }

    public void permutation_helper(int[] num,boolean[] visited){
        if(item.size()==num.length){
            res.add(new ArrayList<Integer>(item));
            return;
        }   
        for(int i = 0; i<num.length;i++){
            if(!visited){
                item.add(num);
                visited=true;
                permutation_helper(num,visited);
                item.remove(item.size()-1);
                visited=false;
            }
        }
    }
}

=========我是分割线===========
不懂得是红色这行为啥不能写res.add(item);这个和原来的有啥区别?这个就会跑不出结果,原来的就pass。
求指导,还是说刷了一天脑子短路了。。
yabay91 发表于 2014-12-11 10:33:03 | 显示全部楼层
因为item是一个引用呀。如果按照你这么写,现在加进去之后,没问题,但是返回之后,其它递归的所有更改都是基于你的这个item的呀~你可以试着在本地run一下,不出意外的话你最终的res里面只会有一个元素~
回复 支持 反对

使用道具 举报

MCwong 发表于 2014-12-11 11:11:29 | 显示全部楼层
new一个,分配新空间, 不然之后对item的操作会影响前面已经存好的
回复 支持 反对

使用道具 举报

yls0327 发表于 2014-12-12 05:02:05 | 显示全部楼层
因为之前的结果会被用到下一层递归中,所以就不对了
这种都需要“保护现场”,add,递归,之后再remove掉
回复 支持 反对

使用道具 举报

宝贝忆彼岸 发表于 2014-12-12 10:43:29 | 显示全部楼层
因为在递归的时候,item是会变的,如果直接加在res里面,到最后,res里面存的都是一样的ArrayList<Integer>
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-9 06:09

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表