zoukankan      html  css  js  c++  java
  • 46. Permutations

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

    Example:

    Input: [1,2,3]
    Output:
    [
      [1,2,3],
      [1,3,2],
      [2,1,3],
      [2,3,1],
      [3,1,2],
      [3,2,1]
    ]
    public class Solution {
        public List<List<Integer>> permute(int[] nums) {
            List<List<Integer>> res = new ArrayList<List<Integer>>();
            if(nums == null || nums.length == 0){
                return res;
            }
            boolean [] used = new boolean[nums.length];  //By default,boolean数组的值是false。记住。
            helper(nums,used,new ArrayList<Integer>(), res);
            return res;
        }
        private void helper(int[] nums, boolean [] used, List<Integer> item, List<List<Integer>> res){
            if(item.size() == nums.length){
                res.add(new ArrayList<Integer>(item));  //细节,list是refer by reference,所以如果直接add(item)的话,item会一直瞎几把变
                return;
            }
            for(int i = 0; i<nums.length; i++){
                if(!used[i]){
                    used[i] = true;
                    item.add(nums[i]);
                    helper(nums,used,item,res);
                    item.remove(item.size()-1);//代表以nums[i]已经用完,退回
                    used[i] = false;//删了nums【i】used刷新
                }
            }
        }
    }

    随后我看到这篇文章,有点似懂非懂。

    https://www.cnblogs.com/lzxin/p/9714133.html

    import java.util.ArrayList;
    import java.util.List;
    
    public class Permutations {
    
        //题目描述:Given a collection of distinct integers, return all possible permutations.(给定一组不同的整数,返回其所有的可能组合)
        public List<List<Integer>> permute(int[] nums) {
            //一个全局变量,用于保存所有集合
            List<List<Integer>> list = new ArrayList<>();
            //传入三个参数,没有附加参数
            backtrack(list, new ArrayList<>(), nums);
            return list;
        }
    
        private void backtrack(List<List<Integer>> list, List<Integer> tempList, int [] nums){
            //一个终结条件,也就是满足条件的时候
            if(tempList.size() == nums.length){
                //全局变量添加一个满足条件的集合
                list.add(new ArrayList<>(tempList));
            } else{
                for(int i = 0; i < nums.length; i++){
                    if(tempList.contains(nums[i])) continue;
                    //如果tempList没有包含nums[i]才添加
                    tempList.add(nums[i]);
                    //递归调用,此时的tempList一直在变化,直到满足终结条件才结束
                    backtrack(list, tempList, nums);
                    System.out.println("tempList的内容:"+tempList+"-------"+"i的值:"+i);
                    //它移除tempList最后一个元素的作用就是返回上一次调用时的数据,也就是希望返回之前的节点再去重新搜索满足条件。这样才能实现回溯
                    tempList.remove(tempList.size() - 1);
                }
            }
        }
    
        public static void main(String[] args){
            int[] nums={1,2,3};
            (new Permutations()).permute(nums);
        }
    }

    main方法测试,输出语句的结果显示如下,可以观察出回溯的过程

    tempList的内容:[1, 2, 3]-------i的值:2
    tempList的内容:[1, 2]-------i的值:1
    tempList的内容:[1, 3, 2]-------i的值:1
    tempList的内容:[1, 3]-------i的值:2
    tempList的内容:[1]-------i的值:0
    tempList的内容:[2, 1, 3]-------i的值:2
    tempList的内容:[2, 1]-------i的值:0
    tempList的内容:[2, 3, 1]-------i的值:0
    tempList的内容:[2, 3]-------i的值:2
    tempList的内容:[2]-------i的值:1
    tempList的内容:[3, 1, 2]-------i的值:1
    tempList的内容:[3, 1]-------i的值:0
    tempList的内容:[3, 2, 1]-------i的值:0
    tempList的内容:[3, 2]-------i的值:1
    tempList的内容:[3]-------i的值:2

    
    
  • 相关阅读:
    ElementUI中弹窗使用textarea原样显示SpringBoot后台带换行的StringBuilder内容
    Node搭建静态资源服务器时后缀名与响应头映射关系的Json文件
    Nodejs中搭建一个静态Web服务器,通过读取文件获取响应类型
    JS中怎样比较两个时分格式的时间大小
    ElementUI中对el-table的某一列的时间进行格式化
    MongoDb在Windows上的下载安装以及可视化工具的下载与使用
    Express中使用ejs新建项目以及ejs中实现传参、局部视图include、循环列表数据的使用
    FFmpeg-20160506-snapshot-bin
    FFmpeg-20160428-snapshot-bin
    FFmpeg-20160422-snapshot-bin
  • 原文地址:https://www.cnblogs.com/wentiliangkaihua/p/10341334.html
Copyright © 2011-2022 走看看