day 28|回溯算法 part04
2023-12-15 16:10:08
93.复原IP地址
1. 搞清楚ip地址的有效性:
超过一位的不能以0开头
近一位可以是0
不能超过255(最多三位)
2. 复习: startIndex 相当于就是切割问题的切割点,可以用回溯法全部搜出来
3. Java用StringBuilder来处理字符串,效率会更高 (本题可以把ip地址的每个部分存入一个list)
4.需要考虑到四个ip段,有四个之后就需要结束回溯
这样写更好(工程习惯)
if(path.size()==4){
if(startIndex==s.length()){
res.add(String.join(".",path));
}
return;
}
如果为4,可以直接结束,进行剪枝,如果为4个ip段时还回溯搜索完了整个字符串,说明可以把当前path加入结果。
78.子集
组合问题且数组中的元素都惟一
子集问题就是找到树的所有节点
画树形结构可知:这种情况利用startIndex 传入i+1来控制子集的可选项。最后遍历所有节点,就相当于记录下了所有的子集集合(不需要剪枝)
保存结果的条件要放在逻辑最开头 (相当于是多叉树的前序遍历位置)空集也相当于遍历到了(多叉树根节点)
可以不写终止条件:1.因为所有节点都要遍历2.startIndex是不断在增大的,会不满足for循环条件,相当于直接return,所以不会进入死循环;
如果要写终止条件,收获结果应该要写在终止条件前面,否则会漏掉自己
class Solution {
List<List<Integer>> result = new ArrayList<>();// 存放符合条件结果的集合
LinkedList<Integer> path = new LinkedList<>();// 用来存放符合条件结果
public List<List<Integer>> subsets(int[] nums) {
subsetsHelper(nums, 0);
return result;
}
private void subsetsHelper(int[] nums, int startIndex){
result.add(new ArrayList<>(path));//「遍历这个树的时候,把所有节点都记录下来,就是要求的子集集合」。
if (startIndex >= nums.length){ //终止条件可不加
return;
}
for (int i = startIndex; i < nums.length; i++){
path.add(nums[i]);
subsetsHelper(nums, i + 1);
path.removeLast();
}
}
}
90.子集II
与上题区别:要处理重复项:
重复项要点复习:
树枝去重与树层去重
去重题一定要对集合排序
文章来源:https://blog.csdn.net/AdrianLeon/article/details/134912477
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!