Example:
Input: nums = [1,2,3] Output: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
典型排列组合的变形,递归穷举所有情况。大家一定要掌握DFS(深度搜索)法,也叫做递归法,回溯法求解。因为DFS能够穷举所有情况,达到求解所有可能解的要求。八皇后问题也是经典的DFS问题。
解题思路:
利用DFS列举所有情况。
递归结束条件:i == length - 1,即处理到最后一个元素
核心逻辑:对于当前元素,有两种选择,加入or不加入subset。这两种情况分别递归调用DFS()函数,对下一个元素做相同逻辑处理。注意加入后要pop_back(),为了不影响之前元素的结果。
C++版本
class Solution {
public:
vector<vector<int>> result;
vector<int> subset;
int length;
void DFS(vector<int>& nums, int i){
if(i == length - 1){
result.push_back(subset); //不加入最后一个元素的子集
subset.push_back(nums[i]);
result.push_back(subset); //加入了最后一个元素的子集
subset.pop_back();
}
else{
DFS(nums, i + 1); //不加入当前元素,进行递归
subset.push_back(nums[i]);
DFS(nums, i + 1); //加入当前元素,进行递归
subset.pop_back();
}
return;
}
vector<vector<int>> subsets(vector<int>& nums) {
length = nums.size();
DFS(nums, 0);
return result;
}
};
Java版本
class Solution {
List<List<Integer>> result = new ArrayList<>();
List<Integer> subset = new ArrayList<>();
int length;
void DFS(int[] nums, int i){
if(i == length - 1){
result.add(new ArrayList<Integer>(subset)); //不加入最后一个元素的子集
subset.add(nums[i]);
result.add(new ArrayList<Integer>(subset)); //加入了最后一个元素的子集
subset.remove(subset.size() - 1);
}
else{
DFS(nums, i + 1); //不加入当前元素,进行递归
subset.add(nums[i]);
DFS(nums, i + 1); //加入当前元素,进行递归
subset.remove(subset.size() - 1);
}
return;
}
public List<List<Integer>> subsets(int[] nums) {
length = nums.length;
DFS(nums, 0);
return result;
}
}
本小白华中科技大学在读研究生,自然语言处理方向。现每日一更LeetCode Top 100 Liked Questions, 旨在于通过通俗易懂的画风和诸位计算机朋友们一起成长呀,不局限某题,争取举一反三,所有Questions均呈上C++和Java解法,不足之处多多指正,共同学习。