• leetcoe--47. Permutations II


    1、问题描述

    Given a collection of numbers that might contain duplicates, return all possible unique permutations.

    For example,
    [1,1,2] have the following unique permutations:

    [
      [1,1,2],
      [1,2,1],
      [2,1,1]
    ]

    2、边界条件:重复数字,去重方法是重要考察点,采用事前去重是有效率的。

    3、思路:排列问题,递归的方法实现,先取一个数放在位置1,然后剩下N-1个位置,再依次放入;循环,取第二个数放在位置1。

    4、代码实现

    方法一

    class Solution {
        public List<List<Integer>> permuteUnique(int[] nums) {
            List<List<Integer>> results = new ArrayList<>();
            Arrays.sort(nums);
            List<Integer> numList = new ArrayList<>();
            for (int i = 0; i < nums.length; i++) {
                numList.add(nums[i]);
            }
            permuteUnique(results, new ArrayList<Integer>(), numList);
            return results;
        }
    
        public void permuteUnique(List<List<Integer>> results, List<Integer> cur,
                                  List<Integer> numList) {
            if (0 == numList.size()) {
                List<Integer> result = new ArrayList<>(cur);
                results.add(result);
                return;
            }
            for (int i = 0; i < numList.size(); i++) {
                if (i != 0 && numList.get(i) == numList.get(i - 1)) { //事前去重
                    continue;
                }
                cur.add(numList.get(i));
                numList.remove(i);
                permuteUnique(results, cur, numList);
                numList.add(i, cur.get(cur.size() - 1));
                cur.remove(cur.size() - 1);
            }
        }
    }

    方法二

    优化一下数据结构

  • 相关阅读:
    [Canvas]RPG游戏雏形 (地图加载,英雄出现并移动)
    [Canvas]计时表/秒表
    [Canvas]新版箴言钟表
    [Canvas]用透明PNG图在背景上画前景能不遮挡背景
    [Canvas]动态背景
    [Canvas]更多的球
    [Canvas]碰撞球 增加小球间碰撞检测
    [Canvas]碰撞球
    [Canvas]越来越近的女孩
    [Canvas]走近的女孩
  • 原文地址:https://www.cnblogs.com/shihuvini/p/7450407.html
Copyright © 2020-2023  润新知