Description:
Given a set of distinct integers, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
Example:
Input: nums = [1,2,3]
Output:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
题意:计算一个元素序列的所有子集;
解法:可以考虑利用回溯来解决;因为要去除重复,可以利用哈希来实现,考虑到顺序的关系(例如:{1,2,3}和{1,2,3}是相同集合),因此哈希表中存储的应当是排序后的;
Java
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
powerSet(nums, res, new ArrayList<Integer>(),
new boolean[nums.length], new HashSet<List<Integer>>());
return res;
}
private void powerSet(int[] nums, List<List<Integer>> res,
List<Integer> temp, boolean[] visited, Set<List<Integer>> table) {
List<Integer> t = new ArrayList<>(temp);
Collections.sort(t);
if (!table.contains(t)) {
res.add(new ArrayList<>(temp));
}
table.add(t);
if (temp.size() == nums.length) return;
for (int i = 0; i < nums.length; i++) {
if (visited[i]) continue;
visited[i] = true;
temp.add(nums[i]);
powerSet(nums, res, temp, visited, table);
visited[i] = false;
temp.remove(temp.size() - 1);
}
}
}