面試遇上了這個問題,思量了會,想到用遞迴的方式解決這個問題。回來網上搜尋了下,發現通過二進位制的思想來解決這個問題更容易,下面我把兩種解決方式的思想及原碼分享出來。
我們都知道,乙個含n個元素的集合擁有2^n個子集合,並且不難發現,其中每個子集合都是從0到2^n-1 每個數的二進位制格式中0 放棄,1選擇的結果。集合的所有子集合如下所示:
{}000 100 010 110 001 101 011 111 。
#include
void printsubset(int set, int count)
/*count: the count of set's elemnts.*/
j >>= 1;
k++;
}printf("}\n");}}
int main()
;printsubset(a, 5);
return 0; }
遞迴的思想是當乙個集合只有1個元素是,集合的子集合就是元素本身。如果集合的元素個數大於1,那麼集合的子集合為:全集 + 出去第乙個元素的集合的所有子集 + 第乙個元素和去除第乙個元素所有子集組合的集合。以遞迴的思想實現要複雜很多,並且當集合元素過多時造成棧溢位。
#include
#include
using namespace std;
set> getsubset(setinput)
else
}return result;
}void printsubset(set> subsets)
printf("}\n");}}
int main()
輸出乙個集合的所有子集
輸出字串的所有子集 如 對 abc 輸出 c b bc a ac ab abc 第一種做法 2 n 遍歷每個字元,每個字元只能取或者不取。取就把該字元加入結果中,遍歷完畢後,輸出結果字串。如下 main.cpp 輸出乙個集合的所有子集 created by zjl on 16 8 10.includ...
如何得到某集合的所有子集合
我們都知道,乙個含n個元素的集合擁有2 n個子集合,並且不難發現,其中每個子集合都是從0到2 n 1 每個數的二進位制格式中0 放棄,1選擇的結果,如下所示 000 100010 110001 101011 111所以根據數字的二進位制轉換,可以輕鬆獲得乙個集合的所有子集合,如下 sub getal...
輸出乙個集合的所有子集(演算法)
輸出乙個集合的所有子集 演算法 時間複雜度很顯然,最少也是2 n,空間複雜度,是n,比較簡單 每個元素要麼在子集中,要麼不在,用 j 的二進位制形式的每一位代表陣列a中對應的位置的元素是否在子集中,例如,當i 5時,j i 5,那麼j 0101 我們對應的輸出 a 0 a 2 這個過程在while迴...