LeetCode78-子集

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

输入: nums = [1,2,3]
输出:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

一、思路

(一)回溯算法

求全部子集,这一类包含“全部”字样的问题都能使用回溯算法解决

问题在于,这里子集的长度不一,需要设置一个长度,当满足该长度时,才可返回

C++代码:

class Solution {
public:
	vector<vector<int>> ans;
	vector<vector<int>> subsets(vector<int>& nums) {
		vector<int> subset;
		for (int len = 0; len <= nums.size(); len++)
			backTracking(nums, subset, 0, len);
		return ans;
	}
	void backTracking(vector<int>& nums, vector<int>& subset, int pos, int len) {
		if (subset.size() == len) {
			ans.push_back(subset);
			return;
		}
		for (int i = pos; i < nums.size(); i++) {
			subset.push_back(nums[i]);
			backTracking(nums, subset, i + 1, len);
			subset.pop_back();
		}
	}
};

执行效率:
在这里插入图片描述

(二)深度优先搜索(DFS)

回溯算法其实也算DFS,直接使用DFS也可以解决这个问题

因为是寻找所有的子集,因此不再需要设置长度了

C++代码:

class Solution {
public:
	vector<vector<int>> ans;
	vector<vector<int>> subsets(vector<int>& nums) {
		vector<int> subset;
		dfs(nums, subset, 0);
        return ans;
	}

	void dfs(vector<int>& nums, vector<int>& subset, int pos) {
		ans.push_back(subset);
		for (int i = pos; i < nums.size(); i++) {
			subset.push_back(nums[i]);
			dfs(nums, subset, i + 1);
			subset.pop_back();
		}
	}
};

执行效率:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lyd1995/article/details/89173472