Subsets II (LeetCode)
Question:
https://oj.leetcode.com/problems/subsets-ii/
跟Subsets I一样,只不过多了判断重复的步骤。如果k和K+1是相同的,则K添加到K之前set生成的新set,与K+1添加到K之前的set生成的新set是一样的,所以对于K+1来说,只需要添加到与K之后生成的新set即可。
另外一种方法就是DFS,对于当前的list来说,可以加上之后的任何一个数,形成新的list。比如从i+1到n.只是要注意的是处理完第i+1的数后,要把list恢复成处理i+1之前的样子。
class Solution { public: vector<vector<int> > subsetsWithDup(vector<int> &S) { vector<vector<int>> result; std::sort(S.begin(), S.end()); /* result.push_back(vector<int>()); int newAdded = 1; for (int i = 0; i < S.size(); i++) { newAdded = subsetsbacktracking(result, S, i, newAdded); } */ // start from -1 to include empty list vector<int> list; subsetdfs(result, S, list, -1); return result; } void subsetdfs(vector<vector<int>>& result, vector<int>& S, vector<int>& list, int pos) { int size = list.size(); if (pos >= 0) list.push_back(S[pos]); result.push_back(list); for (int i = pos+1; i < S.size(); i++) { if (i != pos+1 && S[i] == S[i-1]) continue; subsetdfs(result, S, list, i); } list.erase(list.begin()+size, list.end()); } int subsetsbacktracking(vector<vector<int>>& result, vector<int>& S, int k, int newAddedLast) // may not be backtracking { int size = result.size(); int start = 0; if (k > 0 && S[k] == S[k-1]) start = size - newAddedLast; for (int i = start; i < size; i++) { vector<int> newList = result[i]; newList.push_back(S[k]); result.push_back(newList); } return (size - start); } };
浙公网安备 33010602011771号