zoukankan      html  css  js  c++  java
  • 46. 全排列

    给定一个 没有重复 数字的序列,返回其所有可能的全排列。

    示例:

    输入: [1,2,3]
    输出:
    [
      [1,2,3],
      [1,3,2],
      [2,1,3],
      [2,3,1],
      [3,1,2],
      [3,2,1]
    ]

    class Solution {
        public List<List<Integer>> permute(int[] nums) {
            List<List<Integer>> lists = new ArrayList<>();
            if(nums == null || nums.length == 0) return lists;
            boolean[] visited = new boolean[nums.length];
            bt(nums,new ArrayList<>(),lists,visited);
            return lists;
        }
        private void bt(int[] nums,List<Integer> list,List<List<Integer>> lists,boolean[] visited){
            if(list.size() == nums.length){
                lists.add(new ArrayList<>(list));
                return;
            }
            for(int j = 0;j < nums.length;j++){
                if(!visited[j]){
                    visited[j] = true;
                    list.add(nums[j]);
                    bt(nums,list,lists,visited);
                    visited[j] = false;
                    list.remove(list.size() - 1);
                }
            }
        }
    }

    给定一个可包含重复数字的序列,返回所有不重复的全排列。

    示例:

    输入: [1,1,2]
    输出:
    [
      [1,1,2],
      [1,2,1],
      [2,1,1]
    ]

    class Solution {
        public List<List<Integer>> permuteUnique(int[] nums) {       
            List<List<Integer>> lists = new ArrayList<>();
            if(nums == null || nums.length == 0) return lists;
            boolean[] visited = new boolean[nums.length];
            //需要排序先
            Arrays.sort(nums);
            bt(nums,new ArrayList<>(),lists,visited);
            return lists;
        }
        private void bt(int[] nums,List<Integer> list,List<List<Integer>> lists,boolean[] visited){
            if(list.size() == nums.length){
                lists.add(new ArrayList<>(list));
                return;
            }
            for(int j = 0;j < nums.length;j++){
                if(visited[j] || (j > 0 && nums[j] == nums[j - 1] && !visited[j - 1])){
                    continue;
                }
                visited[j] = true;
                list.add(nums[j]);
                bt(nums,list,lists,visited);
                visited[j] = false;
                list.remove(list.size() - 1);
                
            }
        }
    }
    一回生,二回熟
  • 相关阅读:
    一点一点学写Makefile(3)-增加第三方库和头文件
    一点一点学写Makefile(2)-自动搜所当前目录下的所有源文件
    一点一点学写Makefile-1
    linux下使用libxml2实现对xml文件的读取及查询
    struts2 谷歌浏览器保存date类型数据时报错
    复习
    day31
    day30
    作业29
    day29
  • 原文地址:https://www.cnblogs.com/zzytxl/p/12666342.html
Copyright © 2011-2022 走看看