继续打卡算法题,今天学习的是LeetCode第78题子集,这道题目是道中等题
。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码思维和编码能力有一些提升。
分析一波题目
这个题目求子集,和之前做过组合相关的题目类似,因为子集也是组合,这个题目就非常简单了,还是一样的套路,我们只要把组合想成一棵树遍历就可以了。我们会发现子集就是树上所有的节点
。
比如[1,2,3,4] 的子集,我们用树可以表示出如下树:
树上所有的节点都是子集。
本题解题技巧
1、将子集也转换成组合问题,这样就可以通过遍历树求出子集了。
编码解决
class Solution {
List<List<Integer>> result = new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
int n = nums.length;
List<Integer> subResult= new ArrayList<>();
getSubResult( subResult, 0,nums,n);
return result;
}
public void getSubResult( List<Integer> subResult,int start,int[] nums,int n) {
//满足了组合条件,是一个子集
result.add(subResult);
//遍历到最后一个元素了,除了自己,没有其他组合了,需要结束
if(start >= n) {
return;
}
for(int i=start; i<n; i++) {
List<Integer> tempSubResult= new ArrayList<>();
tempSubResult.addAll(subResult);
tempSubResult.add(nums[i]);
//递归
getSubResult( tempSubResult, i+1,nums,n);
}
}
}
总结
1、任何求组合相关的题目,可以考虑转换成树,我们把树图一画,就能想到一些解题思路