zoukankan      html  css  js  c++  java
  • LeetCode 47 全排列II

    LeetCode 47 全排列II

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

    DFS

    1. 使用一个等长数组标记已使用元素

    执行用时:2 ms, 在所有 Java 提交中击败了74.52%的用户
    内存消耗:39.6 MB, 在所有 Java 提交中击败了40.76%的用户

    /**
     * @author CodeSPA
     * @date 2020/5/28 - 10:52
     */
    import java.util.LinkedList;
    import java.util.Arrays;
    class Solution {
        public List<List<Integer>> result = new LinkedList<>();
        public List<List<Integer>> permuteUnique(int[] nums) {
            if(nums.length == 0){
                result.add(new ArrayList<Integer>());
                return result;
            }
            //首先给数组排序
            Arrays.sort(nums);
            findUnique(nums,new boolean[nums.length],new LinkedList<Integer>());
            return result;
        }
        public void findUnique(int[] nums, boolean[] visited,LinkedList<Integer> trace){
            //结束条件
            if(trace.size() == nums.length){
                result.add(new LinkedList(trace));
                return ;
            }
            //选择列表
            for(int i = 0; i<nums.length; i++){
                //其次,我们已经选择过的不需要再放进去了
                if(visited[i]) continue;
                //接下来,如果当前节点与他的前一个节点一样,并其他的前一个节点已经被遍历过了,那我们也就不需要了。
                if(i>0 && nums[i] == nums[i-1] && visited[i-1]) break;
                //做出选择
                trace.add(nums[i]);
                visited[i] = true;
                findUnique(nums,visited,trace);
                //撤销选择
                trace.removeLast();
                visited[i] = false;
            }
        }
    }
    
  • 相关阅读:
    C++11 std标准库chrono获取系统时间戳
    求取激光光斑质心
    Windows多网卡UDP广播问题
    IP地址分类
    C++各种时间的含义、区别和相互转换
    MFC中控件显示提示信息tooltip
    IP地址 网关 子网掩码之间的关系
    MFC动态添加菜单选项
    opencv函数学习:rotate()的使用
    opencv函数学习:flip()的使用
  • 原文地址:https://www.cnblogs.com/CodeSPA/p/13689330.html
Copyright © 2011-2022 走看看