演算法 全排列,但去除重複排列項

2021-10-09 14:14:03 字數 2078 閱讀 5697

題目

給定乙個可包含重複數字的序列,返回所有不重複的全排列。

輸入: [1,1,2]

輸出:[

[1,1,2],

[1,2,1],

[2,1,1]

]

思路

之前做過全排列。所以思路是,可以先全排列,獲得結果 res

然後再逐項比較,將不重複的項新增到最終結果集 response 中

from typing import list

class

solution

:def

permuteunique

(self, nums: list[

int])-

> list[list[

int]]:

res =

temp =

deffun

(l):

size =

len(l)

if size ==0:

:])return

for i in

range

(size):)

fun(l[

:i]+l[i+1:

])temp.pop(

) fun(nums)

temp =

set(

) response =

for i in res:

i_str =

''.join(

[str

(j)for j in i]

)if i_str not

in temp:

temp.add(i_str)

return response

if __name__ ==

'__main__'

: res = solution(

).permuteunique([1

,1,2

])print

(res)

優化

既然是先加入,再排除,那,我們可以在第一次加入res的時候,就判斷條件是否滿足。

優化**如下:

from typing import list

class

solution

:def

permuteunique

(self, nums: list[

int])-

> list[list[

int]]:

res =

temp =

middle =

set(

)def

fun(l)

: size =

len(l)

if size ==0:

i_str =

''.join(

[str

(j)for j in temp]

)if i_str not

in middle:

middle.add(i_str):]

)return

for i in

range

(size):)

fun(l[

:i]+l[i+1:

])temp.pop(

) fun(nums)

# temp = set()

# response =

# for i in res:

# i_str = ''.join([str(j) for j in i])

# if i_str not in temp:

# temp.add(i_str)

return res

if __name__ ==

'__main__'

: res = solution(

).permuteunique([1

,1,2

])print

(res)

全排列不重複

include include include using namespace std int h 256 define n 100 char indexss 儲存上乙個排列的值 重複的排列是相鄰的 void quanpaiwithoutrepety char a,int len,int index...

不可重複全排列。。。。

比如說 122 有重複數字 想想如何計算個數,就是全排列除以重複的全排列 只要讓重複的有順序就好了。於是用個used 來計算個數,第n個只有在第n 1個用過之後才能用。這樣就 ok 了 include include include include include include include i...

演算法 全排列

從n個不同元素中任取m m n 個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的乙個排列。當m n時所有的排列情況叫全排列。用演算法分別實現全排列,其中n個元素儲存在乙個長度為n的陣列中。實現全排列之前,先看一下對進行全排列的一種方法 從圖中可以看出,我們首先從n個元素中取出乙個元...