非重複組合排列(含重複數字時,生成不重複組合排列)

2021-05-28 14:19:11 字數 1450 閱讀 7478

sample input

1 2 2 3

sample output

分析資料:這裡和不含重複資料生成全組合排列**是不同的,如果使用原**會出現重複的資料,主要原因是在遞迴的時候,會把那些重複的數字當作不同的數字利用,而平等對待,直接進行遞迴。我們要做的就是把相同的數區分出來,我們這裡可以引入乙個陣列mat,專門記錄不同的資料,used陣列記錄每個數字出現的次數。

在遞迴的時候,因為陣列mat的儲存是不重複的,進而可以避免出現重複的組合。

又因為used記錄的次數,程式可以知道在乙個組合中每個數字用的次數,而可以在乙個組合中,出現應該出現的重複

#include using namespace std;

const int len = 10;

int n;

int num;

int mat[len];

int result[len];

int used[len];

void push(int varnum);

void solve(int level);

int main()

solve(0);

system("pause");

return 0;

}/*----------------------

操作的目的:生成乙個資料全不重複的陣列,並記錄每個數出現的次數

初始條件:

n:記錄選取資料的總長度

操作結果:

num:記錄不重複數的個數(mat陣列中資料的長度)

mat陣列:儲存不重複的資料

used陣列:統計對應mat陣列位置資料的出現次數

函式引數:

varnum:儲存剛剛輸入的資料,用來檢測是不是重複的資料

------------------------*/

void push(int varnum)

} mat[num]=varnum;

used[num]++;

num++;

}/*----------------------

操作的目的:普通選擇性組合排列

初始條件:

n:記錄選取資料的總長度

mat陣列:儲存選取資料

used陣列:記錄對應資料出現的次數

result陣列:儲存已得到的結果

操作結果:

輸出result陣列,所有的非重複組合排列

函式引數:

level:既代表遞迴的層次,也代表result陣列已經處理到第幾位了

一句話就是:把沒用完的數放到result陣列的第level位上

------------------------*/

void solve(int level)

cout<} else

}}}

子集 2 (含重複數字)

給定乙個可能包含重複元素的整數陣列nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。輸入 1,2,2 輸出 2 1 1,2,2 2,2 1,2 這個題目的解題思想是這樣的。由於nums內的元素存在重複,那麼我們必然需要 考慮如果元素重複了,怎麼去處理這個元素。最直觀的想法是說比...

46 全排列(無重複數字)

這是無重複數字的全排列。注意遞迴函式中的迴圈 迴圈起始位置 和used陣列的使用 class solution void dfs int nums for int i 0 i還學習了交換法,不用申請used陣列。但是看了看,好像空間也沒節省多少啊。可能是因為為了轉換成list要將int轉換成inte...

DFS有重複數字的全排列

此文寫於2017 11 25 全排列就不說了,乙個next permutation就解決了。但是有重複的數字還能用基本的全排列嗎?答案顯然是不能的,我們需要一些語句來幫助我們避免重複。讓我們結合 來分析 有重複的全排列 include include using namespace std cons...