LintCode 16 帶重複元素的排列

2022-09-12 06:36:14 字數 2283 閱讀 6958

寫在前面:這題和全排列不含重複元素的那題幾乎一樣,我比較垃圾,就用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...