博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode第47题思悟—— 全排列 II(permutations-ii)
阅读量:4108 次
发布时间:2019-05-25

本文共 2370 字,大约阅读时间需要 7 分钟。

LeetCode第47题思悟—— 全排列 II(permutations-ii)

知识点预告

  1. 深度优先搜索;
  2. 数据去重;

题目要求

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

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/permutations-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

示例

输入: [1,1,2]

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

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/permutations-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我的思路

public List
> permute(int[] nums) {
Arrays.sort(nums); List
> results=new ArrayList<>(); if(nums.length==0){
return results; } boolean[] books=new boolean[nums.length]; List
start; List
> startList=new ArrayList<>(); int lastNum; for(int i=0;i
(nums.length); start.add(nums[i]); startList.add(start); books[i] = true; results.addAll(stepForward(nums, books, startList, nums.length - 1)); books[i] = false; startList.remove(start); lastNum=nums[i]; i++; while(i
> stepForward(int[]nums,boolean[] books, List
> products,int needNum){ if(needNum==0){ return products; } int restNum=needNum; List
>nextToFill=products; List
>currentToFill; List
>result=new ArrayList<>(); int lastNum=nums[0]; for(int i=0;i
0) { nextToFill = new ArrayList<>(currentToFill.size()); for (List
list : currentToFill) { nextToFill.add(new ArrayList<>(list)); list.add(nums[i]); } } else { for (List
list : currentToFill) { list.add(nums[i]); } } result.addAll(stepForward(nums, books, currentToFill, needNum - 1)); books[i] = false; lastNum=nums[i]; i++; while(i

优秀解法

public List
> permuteUnique(int[] nums) {
List
> permutes = new ArrayList<>(); List
permuteList = new ArrayList<>(); Arrays.sort(nums); boolean[] hasVisited = new boolean[nums.length]; dfs(permuteList, permutes, hasVisited, nums); return permutes;}private void dfs(List
permuteList, List
> permutes, boolean[] visited, final int[] nums) { if(permuteList.size() == nums.length) { permutes.add(new ArrayList<>(permuteList)); return; } for (int i = 0; i < visited.length; i++) { if (i != 0 && nums[i] == nums[i - 1] && !visited[i - 1]) { continue; } if (visited[i]) { continue; } visited[i] = true; permuteList.add(nums[i]); dfs(permuteList, permutes, visited, nums); permuteList.remove(permuteList.size() - 1); visited[i] = false; }}

差异分析

自己解法所存在的问题还是同上一题一样,中间数据的复制操作过于频繁;该题的解法是深度优先搜索;

知识点小结

  1. 深度优先搜索;
  2. 数据去重;
你可能感兴趣的文章
inet_ntoa、 inet_aton、inet_addr
查看>>
用模板写单链表
查看>>
链表各类操作详解
查看>>
C++实现 简单 单链表
查看>>
Linux的SOCKET编程 简单演示
查看>>
Linux并发服务器编程之多线程并发服务器
查看>>
C语言内存检测
查看>>
Linux epoll模型
查看>>
Linux系统编程——线程池
查看>>
Linux C++线程池实例
查看>>
shared_ptr的一些尴尬
查看>>
C++总结8——shared_ptr和weak_ptr智能指针
查看>>
c++写时拷贝1
查看>>
Linux网络编程---I/O复用模型之poll
查看>>
Java NIO详解
查看>>
在JS中 onclick="save();return false;"return false是
查看>>
idea 有时提示找不到类或者符号
查看>>
matplotlib.pyplot.plot()参数详解
查看>>
MFC矩阵运算
查看>>
ubuntu 安装mysql
查看>>