Subsets (LeetCode)
Question:
https://oj.leetcode.com/problems/subsets/
解法1:
backtracking。先求前K个字符的vector<vector<int>>组合ListK(假设string是排序好的)
ListK = {v1, v2, v3, v4..., v(2^k)}
则List(K+1) = ListK + {v1+s[k+1], v2+s[k+1], ..., v(2^k)+s[k+1]}
解法2:
可以得知N个字符会有2^N种情况,假设N<32,可以用一个int的bit[k]表示s[k]. bit[k]==1表示s[k]存在.
比如 0x01 = {s[0]}, 0x02 = {s[1]}, 0x03 = {s[0,1]}
class Solution { public: vector<vector<int> > subsets(vector<int> &S) { // sort S first std::sort(S.begin(), S.end()); vector<vector<int>> result; /* result.push_back(vector<int>()); for (int i = 0; i < S.size(); i++) { subsetbacktracking(result, S, i); } */ bits(result, S); return result; } void subsetbacktracking(vector<vector<int>>&result, vector<int>& s, int k) { int size = result.size(); for (int i = 0; i < size; i++) { vector<int> newList = result[i]; newList.push_back(s[k]); result.push_back(newList); } } void bits(vector<vector<int>>& result, vector<int>& s) { int bitsCount = s.size(); // so size is from 0 to pow(2, bitsCount)-1 int count = 1 << bitsCount; for (int i = 0; i < count; i++) { result.push_back(ConvertNumberToVector(s, i)); } } vector<int> ConvertNumberToVector(vector<int>& s, int number) { vector<int> vec; int i = 0; while (number > 0) { if (number & 0x01) { vec.push_back(s[i]); } number >>= 1; i++; } return vec; } };
浙公网安备 33010602011771号