zoukankan      html  css  js  c++  java
  • 【每日一题-leetcode】 47.全排列 II

    47.全排列 II

    1. 全排列 II

    难度中等281

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

    示例:

    输入: [1,1,2]
    输出:
    [
      [1,1,2],
      [1,2,1],
      [2,1,1]
    ]
    
    此问题和46是相同的思路,使用回溯法 在查找所有解的时候 使用剪枝 取出掉不符合的条件。
    
    代码的实现主要是通过一个boolean数组来判断。如果访问过 continue 如果当前和上一个元素相等  并且上一个元素已经visited 直接continue 。否则就添加。剩下就是回溯法的模板代码。
    
    选择 》 进入下层决策树 》撤销树
    
    
    List<List<Integer>> result = new ArrayList<>();
        //backtrack
        public List<List<Integer>> permuteUnique(int[] nums) {
            if(nums.length == 0 || nums == null)    return null;
            Arrays.sort(nums);
            findUnique(nums,0,new boolean[nums.length],new LinkedList<Integer>());
            return result;
        }
    
        private void findUnique(int [] nums,int start,boolean [] visited,LinkedList<Integer>  track){
            //1.终止条件
            if(nums.length ==  track.size()){
                result.add(new LinkedList<>(track));
                return;
            }
    
            for(int i=0;i<nums.length;i++){
                //如果访问过 直接continue
                if(visited[i]) continue;
                //如果当前节点和前一个节点相等 并且 前一个节点已经被访问过了,直接continue
                if(i>0 && nums[i] == nums[i-1] && visited[i-1])  continue;
                
                //选择
                track.add(nums[i]);
                visited[i] = true;
                //进入下一层决策树
                findUnique(nums,i+1,visited,track);
                //撤销选择
                track.removeLast();
                visited[i] = false;
            }
        }
    
  • 相关阅读:
    ASP.NET Core 介绍和项目解读
    C#性能优化总结
    C# 线程知识--使用Task执行异步操作
    异步编程 In .NET(转载)
    .NET实现WebSocket服务端即时通信实例
    .net core 学习笔记一 Program与Startup
    .net core 自定义中间件
    c# 通过json.net中的JsonConverter进行自定义序列化与反序列化
    c# 通过HttpListener创建HTTP服务
    c# 反射实现模型深拷贝
  • 原文地址:https://www.cnblogs.com/qxlxi/p/12860618.html
Copyright © 2011-2022 走看看