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...