美文网首页
全排列 嵌套循环转递归

全排列 嵌套循环转递归

作者: heoi836 | 来源:发表于2018-12-19 16:16 被阅读0次
  1. 全排列
    给定一个数字列表,返回其所有可能的排列。

样例
给出一个列表[1,2,3],其全排列为:

[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
这里我想到了两种写法: 1:笛卡尔积后去重,2:嵌套循环,忽略上层循环使用过的数

1:笛卡尔积后去重

 public static void main(String[] args) {
       //demo(1);
     
        ArrayList<Integer> source = new ArrayList<>();
        source.add(3);
        source.add(2);
        source.add(1);
        Collections.sort(source);
        sortDemo(source, 1, new ArrayList<>(),new ArrayList<>());
       
    }

 public static void sortDemo(List<Integer> nums, int index, List<Integer> i,List<List<Integer>> result) {
        
        for (int num : nums) {
            if (!i.contains(num)) {
                if (index == nums.size()) {
                    ArrayList<Integer> arrayList = new ArrayList<>(i);
                    arrayList.add(num);
                    result.add(arrayList);
                    System.out.println(arrayList);

                } else {
                    //注意!!! index + 1  不等于 index ++
//注意index ++,不等于index +1;  index +1 等价于 a = index +1;所以index+1 实际是一个临时变量
                    ArrayList<Integer> temp = new ArrayList<>(i);
                    temp.add(num);
                    SortDemo(nums, index + 1, temp,result);
                }
            }
        }
        //System.out.println(result.size());
    }

2:嵌套循环,忽略上层循环使用过的数

public static void main(String[] args) {
        List<List<Integer>> result = new ArrayList<>();

        dfs(new int[]{1,2,3},new boolean[3],new ArrayList<>(),result);
        result.forEach(c -> System.out.println(c));
    }

    private static void dfs(int[] nums,
                     boolean[] visited,
                     List<Integer> permutation,
                     List<List<Integer>> results) {
        if (nums.length == permutation.size()) {
            results.add(new ArrayList<Integer>(permutation));
            return;
        }

        for (int i = 0; i < nums.length; i++) {
            if (visited[i]) {
                continue;
            }

            permutation.add(nums[i]);
            visited[i] = true;
            dfs(nums, visited, permutation, results);
            visited[i] = false;
            permutation.remove(permutation.size() - 1);
        }
    }

相关文章

  • 全排列 嵌套循环转递归

    全排列给定一个数字列表,返回其所有可能的排列。 样例给出一个列表[1,2,3],其全排列为: [[1,2,3],[...

  • 全排列与字典序

    全排列 递归实现全排列; 首先来说递归算法实现全排列: 例如,对于{1,2,3,4}的例子进行全排列,其可以分解...

  • 机试常用算法和题型-递归专题

    递归专题 递归加上图形按规律打印 另一种方向的递归 循环递归+全排列 求组合数递归 递归组合+判断素数,一加一减显...

  • 全排列

    对几个数进行全排列,如1,2,3进行全排列。可以采用递归加循环的方式.一次排列的结束就输出一次。else中的for...

  • 算法复习之字符串(1)

    (1)字符串循环左移 | 字符串全排列(递归,非递归)《本节内容》(2)KMP算法| BF算法(3 字符串的最...

  • 递归-全排列

    对数组{1,2,3}进行全排列 STL next_permutation

  • 字符串全排列-循环递归

    题目描述 输入一串字符串,输出该字符串所有的排列,并且无重复。例如,输入:“abc”,输出:abc、acb、bac...

  • 字符串全排列问题

    今天学习了字符串全排列问题的递归与非递归实现,其中,递归实现是把递归放在循环中,到现在我也没看懂到底是个什么样的过...

  • 全排列与全组合

    递归+交换值实现全排列 非重复的全排列 位运算实现全组和

  • 全排列

    求全排列最简单的就是递归了123 的全排列共有 6 个, 123 的全排列等于以 1 开头 23 的全排列, 加上...

网友评论

      本文标题:全排列 嵌套循环转递归

      本文链接:https://www.haomeiwen.com/subject/qbzuqqtx.html