寫在前面:這題和全排列不含重複元素的那題幾乎一樣,我比較垃圾,就用hashset去掉了重複的元素但是看了九章演算法的答案也沒看懂,他寫的很有感覺。
用了hash,本來想著怎麼寫hashcode()和equal()方法的,哪知道都幫我寫好了,integer型別的元素儲存在list中的hashcode()和equal()的方法可以直接使用
下面是源**和我的測試**:
//這是arraylist父類public abstract class abstractlist中的原始碼
public
inthashcode()
public
boolean
equals(object o)
return !(e1.hasnext() || e2.hasnext());
}
@test
public void test()
//執行結果
// 32
// 33
// 32
// false
// false
// false
// false
// true
// false
下面是我寫的**,只是使用hashset去重
import org.junit.test;
import j**a.util.arraylist;
import j**a.util.hashset;
import j**a.util.list;
public
class
permuteunique
if (nums.length == 0)
boolean color = new
boolean[nums.length];
for (int i = 0; i < nums.length; i++)
dfs(hashresult, list, nums, color);
result = new arraylist<>(hashresult);
return result;
}public
void
dfs(hashset> hashresult, listlist, int nums, boolean color)
for (int i = 0; i < nums.length; i++) }}
@test
public
void
testpermuteunique() );
// for (int i = 0; i < result.size(); i++)
}}
下面是九章的答案,寫的很難懂,狠巧妙
和沒有重複元素的 permutation 一題相比,只加了兩句話:
arrays.sort(nums) // 排序這樣所有重複的數
if (i > 0 && nums[i] == nums[i - 1] && !visited[i - 1]) // 跳過會造成重複的情況
public list> permuteunique(int nums)
arrays.sort(nums);
dfs(nums, new
boolean[nums.length], new arraylist(), results);
return results;
}private
void
dfs(int nums,
boolean visited,
listpermutation,
list> results)
for (int i = 0; i < nums.length; i++)
if (i > 0 && nums[i] == nums[i - 1] && !visited[i - 1])
permutation.add(nums[i]);
visited[i] = true;
dfs(nums, visited, permutation, results);
visited[i] = false;
permutation.remove(permutation.size() - 1);
}}
LintCode 16 帶重複的全排列
原題目 再上一題的基礎上做一點改動,就是判斷是不是已經有了。不過時間3084ms,略慢 class solution int book new int nums.length dfs nums,book,0,item,result return result public void dfs int ...
16 帶重複元素的排列
2017.9.14 如果帶有重複元素,那麼當元素重複的時候,直接continue跳出迴圈進行下乙個就好了。這道題不同於第15道題全排列的地方是輸出必須要按順序輸出,不然會報錯。所以需要提前對陣列進行排序。public class solution if nums.length 1 hashsetse...
lintcode 全排列 帶重複元素的排列
全排列,用了子集樹的解法 class solution backtrack 0,nums return res bool isok int t return true void backtrack int t,vector nums for int i 0 i 帶重複元素的排列 篩選條件就是在i和t...