Permutations

来源:互联网 发布:鼻行动物存在吗 知乎 编辑:程序博客网 时间:2024/05/13 05:21

原题:

Given a collection of distinct numbers, return all possible permutations.

For example,
[1,2,3] have the following permutations:

[  [1,2,3],  [1,3,2],  [2,1,3],  [2,3,1],  [3,1,2],  [3,2,1]]
即返回所给数列所有元素的全部排列(数组没有重复元素)
思考过程:
想到的是一个元素一个元素地添加。每次添加元素,将新元素从头到尾插到每个数组里,形成新的List<List<Integer>>。这里遇到的问题是java赋值语句,对于基本变量都是赋值,对于对象都是传递引用。每次改动数组改动数组会使数组发生变化。后来用了list.addAll()方法就好了。
解题思路:
遍历整个数组调用向结果集中添加元素的函数addElemrnts(),这个函数整理结果集,遍历当前结果集,向里面添加元素,存入结果集,也就是更新结果集。
结果代码:
public List<List<Integer>> permute(int[] nums) {        List<List<Integer>> ret = new ArrayList<>();        List<Integer> list = new ArrayList<>();        list.add(nums[0]);ret.add(list);//初始化结果集        for (int i = 1;i < nums.length;i++)            ret = addElemrnts(ret,nums[i]);//逐个向结果集添加元素        return ret;    }    public List<List<Integer>> addElemrnts(List<List<Integer>> lists,int element){//向结果集添加元素的函数        //p<List<Integer>,Integer> hasMap = new HashMap<>();//用于避免结果集出现重复结果        List<List<Integer>> ret = new ArrayList<>();        for (int i = 0;i < lists.size();i++){//遍历每个数组            for (int j = 0;j <= lists.get(i).size();j++){//向数组每个位置插入新元素,存到结果集                List<Integer> list = new ArrayList<>();                list.addAll(lists.get(i));                list.add(j,element);                // (!hasMap.containsKey(list)) ret.add(list);//判断结果集是否有该数组                //sMap.put(list,1);            }        }        return ret;    }


原创粉丝点击