题解 | #没有重复项数字的全排列#

没有重复项数字的全排列

https://www.nowcoder.com/practice/4bcf3081067a4d028f95acee3ddcd2b1

代码:

public class Solution {
    //我的思路,取出来一个元素,然后剩下的元素去排,排的时候加上取出来那个。
    public ArrayList<ArrayList<Integer>> permute(int[] num) {
        // if (num.length == 1) {
        //     ArrayList<Integer> list1 = new ArrayList<>(1);
        //     list1.add(num[0]);
        //     ArrayList<ArrayList<Integer>> list2 = new ArrayList<>(1);
        //     list2.add(list1);
        //     return list2;
        // }
        int length = num.length;

        //先把num排序
        Arrays.sort(num);
        //转数组
        List<Integer> sourceList = new ArrayList<>();
        Arrays.stream(num).forEach(v -> sourceList.add(v));

        List<Integer> list = new ArrayList<>(); //依次保存取出来的元素
        ArrayList<ArrayList<Integer>> resultList = new ArrayList<>();

        // for (Integer i : sourceList) {
        //     list.add(i);
        //     m1(sourceList, i, list, resultList, length);
        // }

        m1(sourceList, null, list, resultList, length);
        return resultList;
    }

    void m1 (List<Integer> sourceList, Integer toRemove, List<Integer> list,
             ArrayList<ArrayList<Integer>> resultList, int length) {
        List<Integer> sourceList2 = new ArrayList<>(sourceList); //深拷贝
        sourceList2.remove(toRemove);
        for (Integer i : sourceList2) {
            ArrayList<Integer> list2 = new ArrayList<>(list); //深拷贝
            list2.add(i);
            if (list2.size() == length) {
                resultList.add(list2);
            } else {
                m1(sourceList2, i, list2, resultList, length);
            }
        }
    }
}

我的做题步骤:

考虑到使用迭代。

我的思路:取出来一个元素,然后剩下的元素去排,排的时候加上取出来那个。然后再取第二个元素,剩下元素去排。

遇到的问题:

1)代码提交后第一个问题出现在深拷贝

这行代码写到了for循环之上,这样会导致第一个元素,一直被放到list中。

2)迭代的初始,不好写初始迭代,用了for循环。

这样也是会导致第一个元素,一直被放到list中。改进,去掉for循环,直接调递归,第一次传入一个null。此时,数组长度等于1的情况也合并到了递归里。

总结:

1)本题,肉眼自测测得不对。

2)迭代的初始步骤,不太会写。我目前的写法是先大概写出来,然后调用递归。后期再看能不能合并到递归里,包括特殊情况也合并到递归里。

全部评论

相关推荐

11-01 20:03
已编辑
门头沟学院 算法工程师
Amazarashi66:这种也是幸存者偏差了,拿不到这个价的才是大多数
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务