递归和回溯_leetcode46-经典的排列去重
时间:2019-03-19
本文章向大家介绍递归和回溯_leetcode46-经典的排列去重,主要包括递归和回溯_leetcode46-经典的排列去重使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
#coding=utf-8
class Solution1(object):
def permuteUnique(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
self.res = []
nums.sort()
length = len(nums)
self.used = [False for i in range(length)]
self.generatePermute(nums,0,[])
if 0:
print "lx"
if 1:
print "dd"
print self.res
return self.res
# 去重思路:同一个位置的值不能出现两次,即下一个进入该位置的值,不能
# 和该位置刚出栈的值相同
def generatePermute(self,nums,index,p):
if index == len(nums):
self.res.append(p[0:])
return
old = None
for i in range(len(nums)):
# if old:
# if not self.used[i] and nums[i] != old:
# p.append(nums[i])
# self.used[i] = True
# self.generatePermute(nums,index+1 ,p)
# self.used[i] = False
# old = p.pop()
# else:
# if not self.used[i]:
# p.append(nums[i])
# self.used[i] = True
# self.generatePermute(nums,index+1 ,p)
# self.used[i] = False
# old = p.pop()
#if old != None:
if old: # 这句有坑 原因在于 if 0 是假的
if self.used[i] == False and old != nums[i]:
p.append(nums[i])
self.used[i] = True
self.generatePermute(nums, index + 1, p)
self.used[i] = False
old = p.pop()
else:
if self.used[i] == False:
p.append(nums[i])
self.used[i] = True
self.generatePermute(nums, index + 1, p)
self.used[i] = False
old = p.pop()
# solution1 是错误的
class Solution2(object):
def permuteUnique(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
self.res = []
nums.sort()
self.visit = [0 for i in range(len(nums))]
self.old = None
for i in range(len(nums)):
if self.old == None:
self.generatePermute(nums,i,0,[])
self.old = nums[i]
else:
if nums[i] == self.old:
continue
else:
self.generatePermute(nums, i, 0, [])
self.old = nums[i]
print self.res
def generatePermute(self, nums,start,index, p):
self.visit[start] = 1
p.append(nums[start])
self.getPermute(nums,index+1,p)
self.visit[start] = 0
p.pop()
def getPermute(self, nums, index, p):
if index == len(nums):
self.res.append(p[0:])
return
for i in range(len(nums)):
if self.visit[i] == 0:
p.append(nums[i])
self.visit[i] = 1
self.getPermute(nums, index + 1, p)
self.visit[i] = 0
self.old = p.pop()
# Solution1 的思路是正确的
# Solution2 是错的
class Solution3(object):
def permuteUnique(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
self.res = []
nums.sort()
self.visit = [0 for i in range(len(nums))] self.old = None self.generatePermute(nums,0,[]) print self.res def generatePermute(self, nums,index, p): if index == len(nums): self.res.append(p[0:]) old = None for i in range(len(nums)): if old == None: if self.visit[i] == 0: p.append(nums[i]) self.visit[i] = 1 self.generatePermute(nums,index+1,p) self.visit[i] = 0 old = p.pop() else: if self.visit[i] == 0 and nums[i] != old: p.append(nums[i]) self.visit[i] = 1 self.generatePermute(nums,index+1 ,p) self.visit[i] = 0 old = p.pop()s = Solution1()n = [1,1,2]n1 = [0,1,0,0,9]n2 = [0,1,0,0]n3 = [0,0,1]n4 = [1,2,3]n5 = [2,3,2]n6 = [1,1]s.permuteUnique(n6)
- OpenCV亚像素角点cornerSubPixel()源代码分析
- mongodb11天之屠龙宝刀(十) 备份 还原 导出 导入::CSV,JSON,BOSN,解决中文乱码
- 【Go 语言社区】 golang 算法课程 第一季 第2节 洗牌算法
- 一条update语句的优化探索(r9笔记第80天)
- OpenCV角点检测源代码分析(Harris和ShiTomasi角点)
- Java基础-day03-代码题
- mongodb11天之屠龙宝刀(九)js函数入门:MongoDB基于js的数据类型修改
- Go语言社区 APP --问答模块数据存储流程及代码
- Java基础-day09-重构随机点名器
- OpenCV3.4两种立体匹配算法效果对比
- 文件操作常用函数
- Java基础-day09-对象;类;封装 学生管理系统
- two Pass方法连通域检测
- 【Java入门提高篇】Day14 Java中的泛型初探
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP迭代器和生成器用法实例分析
- php中关于换行的实例写法
- laravel 获取当前url的别名方法
- php中文语义分析实现方法示例
- laravel 中某一字段自增、自减的例子
- php统计数组不同元素的个数的实例方法
- PHP实现单条sql执行多个数据的insert语句方法
- PHP的JSON封装、转变及输出操作示例
- php 策略模式原理与应用深入理解
- 解决在Laravel 中处理OPTIONS请求的问题
- PHP使用观察者模式处理异常信息的方法详解
- php判断目录存在的简单方法
- 怎么优雅的使用 laravel 的 validator验证办法
- Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
- php设计模式之适配器模式原理、用法及注意事项详解