算法<不含相同元素数组的全排列>

来源:互联网 发布:赣州淘宝培训 编辑:程序博客网 时间:2024/05/20 02:50

这里只考虑元素是各不相同的情况

思路:全排列其实可以从前往后,分别将每一个数字与其后面的数字进行交换,从而得到所有的结果。比如由1,2,3可以得到1,2,3、2,1,3、3,2,1三种,然后有1,2,3可以得到1,2,3和1,3,2,依次类推。
化成图就是下面的结果:
这里写图片描述

代码如下:

import java.util.ArrayList;import java.util.List;import java.util.stream.Collectors;import java.util.stream.IntStream;/** * @author * @version 2017/7/5.19:28 */public class Demo {    public static void main(String[] args) {        int[] nums = {1, 2, 3};        List<List<Integer>> result = new Demo().permute(nums);        for (List<Integer> integers : result) {            for (Integer integer : integers) {                System.out.print(integer + " ");            }            System.out.println();        }    }    public List<List<Integer>> permute(int[] nums) {        List<List<Integer>> res = new ArrayList<>();        helper(res, nums, 0);        return res;    }    private static void helper(List<List<Integer>> res, int[] nums, int start) {        if (start == nums.length - 1) {            //将int[]转换为List            List<Integer> temp = IntStream.of(nums).boxed().collect(Collectors.toList());            res.add(temp);            return;        }        for (int i = start; i < nums.length; ++i) {            swap(nums, start, i);            helper(res, nums, start + 1);            swap(nums, start, i);        }    }    private static void swap(int[] A, int i, int j) {        int temp = A[i];        A[i] = A[j];        A[j] = temp;    }}
阅读全文
0 0