全排列的題首先可以想到用回溯解決。在本題中,需要考慮的有兩點:如何判斷構建的排列陣列是否存在重複,以及如何避免使用重複的元素。
避免重複比較簡單,可以構建乙個與nums等長的陣列,用於記錄哪個元素被使用過,這樣在往下遍歷時可以用該陣列進行判斷並避免重複使用。
去重則比較麻煩,可以考慮使用jdk自帶的set型別的集合,自動實現去重,但這樣效率較低,可以嘗試使用剪枝完成去重。首先將陣列進行排序,這樣重複的數字就被擺列在相鄰的位置,然後每次遞迴前,首先判斷一下當前元素是否等於上乙個元素。如果相等,而且上乙個元素已被使用,那麼說明在遞迴樹中的這乙個分支必定與上乙個元素所形成的的分支重複,直接跳過該次for迴圈。
class
solution
public
void
helper
(list
path,
int[
] nums,
boolean
used)
for(
int i=
0; i(i>0&&
!used[i-1]
&& nums[i]
==nums[i-1]
) path.
add(nums[i]);
used[i]
=true
;helper
(path, nums, used)
; path.
remove
(path.
size()
-1);
used[i]
=false;}
}}
LeetCode 47 全排列 II 遞迴
難度 中等 給定乙個可包含重複數字的序列,返回所有不重複的全排列。示例 輸入 1,1,2 輸出 1,1,2 1,2,1 2,1,1 記錄每個數字還能夠被選擇的次數numcnt,在選擇數字時用numcnt代替used。class solution function void int index gen...
LeetCode 47 全排列 II 題解
給定乙個包含重複元素的陣列,求全排列。為了做這道題,首先要理清求全排列的本質,實際上求全排列就是固定前面的數,然後對後面的數進行求解,比如一開始的時候選擇第乙個數,然後對剩下的數進行全排列,這樣相當於轉換為乙個子問題,遞迴求解。那麼對於這個問題,假設我們有1,1,3,4四個數,那麼對於第乙個位置,首...
LeetCode47全排列二
昨天沒有寫,今天補上哈。給定乙個可能包含重複數字的集合,返回所有可能的不同全排列。例如,1,1,2 有以下不同全排列 1,1,2 1,2,1 2,1,1 之前寫的是無重複數字的全排列,這次是有重複數字的,這就需要判斷一下是否要進行交換。在加入判斷時,判斷的範圍要注意,因為一開始沒有搞清楚交換的原理啊...