day28 回溯

2023-11-11

  • 39. 组合总和
    • 数字可以被无限制选取,但是无需考虑顺序(组合),因此递归还是需要考虑startIdx,但是每次都从最开始进行回溯,而不是startIdx + 1
  • 40.组合总和II
    • ​​​​​​​通过标识去除重复值(树层去重)
  • 131.分割回文串
    • ​​​​​​​每次找到切割点,进行向后寻找回文,合适的加入list,不合适直接进入下一层循环

package algor.trainingcamp;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * @author lizhe
 * @version 1.0
 * @description:
 *
 * 给定一个无重复元素的数组 candidates 和一个目标数 target ,
 * 找出 candidates 中所有可以使数字和为 target 的组合。
 * candidates 中的数字可以无限制重复被选取。
 *
 * 可以无限次使用,无需使用startIdx
 *
 */
public class LeetCode39 {
    LinkedList<Integer> sub = new LinkedList<>();
    List<List<Integer>> res = new ArrayList<>();

    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        helper(candidates, target, 0, 0);
        return res;
    }

    private void helper(int[] candidates, int target, int sum, int startIdx) {
        if(sum == target){
            res.add(new ArrayList<>(sub));
            return;
        }

        for(int i = startIdx;i < candidates.length;i++){
            sub.add(candidates[i]);
            sum += candidates[i];
            helper(candidates, target, sum, i);
            sum -= candidates[i];
            sub.removeLast();
        }
    }

}
package algor.trainingcamp;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

/**
 * @author lizhe
 * @version 1.0
 * @description:
 *
 * 给定一个候选人编号的集合candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。
 * candidates中的每个数字在每个组合中只能使用一次。
 * 注意:解集不能包含重复的组合。
 *
 * 使用重复数,保证在同一树层上去重
 */
public class LeetCode40 {
    List<List<Integer>> res = new ArrayList<>();
    LinkedList<Integer> sub = new LinkedList<>();

    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        //对同一树层排序,先全体排序
        if(null == candidates || candidates.length == 0){
            return res;
        }

        boolean[] used = new boolean[candidates.length];
        Arrays.sort(candidates);
        helper(candidates, target, 0, used);
        return res;
    }

    public void helper(int[] candidates, int target, int startIdx, boolean[] used){
        if(target < 0){
            return;
        }

        if(target == 0){
            res.add(new ArrayList<>(sub));
            return;
        }


        for(int i = startIdx;i < candidates.length;i++){
            //开始进行树层去重 这里used[i - 1] == false 表示对回溯上来的结果进行判断
            if(i > 0 && candidates[i] == candidates[i - 1] && !used[i - 1]){
                continue;
            }

            used[i] = true;
            sub.add(candidates[i]);
            helper(candidates, target - candidates[i], i + 1, used);
            sub.removeLast();
            used[i] = false;
        }

    }
}
package algor.trainingcamp;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * @author lizhe
 * @version 1.0
 * @description:
 * 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
 *
 * 回文串 是正着读和反着读都一样的字符串。
 * @date 2023/5/1 10:22
 */
public class LeetCode131 {
    LinkedList<String> sub = new LinkedList<>();
    List<List<String>> res = new ArrayList<>();
    public List<List<String>> partition(String s) {
        if(null == s || s.length() == 0){
            return res;
        }

        helper(s, 0);
        return res;
    }

    public void helper(String s, int startIdx){
        if(startIdx >= s.length()){
            res.add(new ArrayList<>(sub));
            return;
        }

        for(int i = startIdx;i < s.length();i++){
            //如果是回文
            if(isPartition(s, startIdx, i)){
                //【startIdx, i】
                String str = s.substring(startIdx, i + 1);
                sub.add(str);
            }else{
                continue;
            }

            helper(s, i + 1);
            sub.removeLast();
        }

    }

    public boolean isPartition(String s, int start, int end){
        while(start < end){
            if(s.charAt(start) != s.charAt(end)){
                return false;
            }

            start++;
            end--;
        }

        return true;
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

day28 回溯 的相关文章

随机推荐

  • jqGrid 常用方法和事件

    jqGrid 常用方法整理 常用方法 获取行数据 删除行数据 重新加载表格 动态设置列显示隐藏 常用事件 常用方法 获取行数据 div div 1 获取所有行数据 jqGrid getRowData 或者 var IDS jqGrid ge
  • 小型软件公司的绩效考核

    近几个月 我常和一些朋友讨论如何在小型软件公司中对软件开发人员进行绩效考核的问题 发现很多朋友都为此问题而烦恼 由于我正好在一家小型软件公司里负 责绩效考核工作 有一些成功的实践经验 所以特此在这里与大家交流一下我的心得 这些心得可能仅限于
  • 通过python构建一个区块链来学习区块链

    了解区块链Blockchains如何工作的最快方法就是构建一个区块链 你来到这里是因为 和我一样 你对加密钱币的崛起感到很兴奋 而且你想知道区块链是如何工作的 想了解它们背后的基本技术 但理解区块链并不容易 或者至少不适合我 我在密集的视频
  • Fisco-bsco 开发联盟链 账户之间的转账

    Fisco bsco 开发联盟链 账户之间的转账 参考 开发第一个区块链应用 FISCO BCOS v2 9 0 文档 fisco bcos documentation readthedocs io 前提 Fisco bcos节点开启 控制
  • 容器性能比无容器服务器,【译】容器 vs 无服务器(Serverless)

    一些历史 不久之前 开发 部署和运维还相当复杂 在一开始 运维不仅需要修补程序代码 还要支持物理机器 保持服务器 硬件与软件处于最新状态也是一项艰巨的任务 在2000年代 一个新的模型 架构即服务 IaaS 很快流行起来 IaaS提供了从第
  • OSG的控制台报错处理

    OSG报错或者出现警告怎么办 最快解决方法是查资料问人 但是都不凑效的情况下 只能分析源码了 报错信息如下 报错调用方定位 触发位置 State cpp bool State checkGLErrors StateAttribute GLM
  • JSP连接数据库

    2019 10 15 JSP连接数据库 一 连接数据库需要用到的包为mysql connector java 5 1 20 bin jar 导入包的方法有两种 1 在Java Build Path中倒导入 2 把我们需要的包拷入WEB IN
  • Java之XML解析-使用dom(org.w3c.dom)解析XML

    转自 Java之XML解析 使用dom org w3c dom 解析XML 下文笔者将讲述使用W3C org w3c dom 提供的接口 解析XML文档的方法分享 W3C解析xml文档的方法 将整个xml文档读入内存 然后构建一个DOM树
  • 如何查看和修改gcc、g++默认include路径

    如何查找gcc g 默认include路径 注意 是Tab上面的那个符号 gcc gcc print prog name cc1plus v g g print prog name cc1plus v 我们都知道在编译的预处理阶段 编译器会
  • Python爬虫的requests(学习于b站尚硅谷)

    目录 一 requests 1 requests的基本使用 1 文档 2 安装 3 响应response的属性以及类型 4 代码演示 2 requests之get请求 3 requests之post请求 1 演示示例 爬取百度翻译 2 ge
  • simulink半桥逆变电路仿真

    逆变是将直流变为脉冲方波信号 电压是100V的 第一幅为原始直流信号 第二幅是逆变电流 第三幅是逆变电压 参数设置 图3 RC1 图4 RC 图5 晶闸管 图6 脉冲信号的参数
  • Java常用类(比较器、System类、Math类、BigInteger和BigDecimal类)

    Java常用类 比较器 System类 Math类 BigInteger和BigDecimal类 一 比较器 一 自然排序 使用Comparable接口 二 定制排序 使用Comparator接口 二 System类 三 Math类 四 B
  • ServletContext

    ServletContext上下文提供对应用程序中所有Servlet所共有的各种资源和功能的访问 Servlet上下文 API用于设置应用程序中所有Servlet共有的信息 Servlet可能需要共享他们之间的共有信息 运行于同 一服务器的
  • 如何使用groovy语言访问url时绕过https ssl认证校验?

    记录一下使用groovy解决https ssl校验问题 import javax net ssl HostnameVerifier import javax net ssl HttpsURLConnection import javax n
  • 生产数据库数据误删、错刷恢复备份实战

    文章目录 故障起因 前提 全备 全备脚本 增备 数据库配置要求 增备脚本 定时备份 故障处理 思路 全备恢复 解析增备 新建binlog解析导出目录 查看整点binlog列表 将每个整点的增量备份文件导出到sql文件 选定结束导入的SQL文
  • react函数式组件(hooks)之useEffect

    文章目录 前言 一 useEffect的作用 二 useEffect的使用 1 class组件 2 函数式组件 总结 前言 React函数式编程没有生命周期 因此需要借助useEffect来实现 一 useEffect的作用 发ajax请求
  • Swift4.0--Photos框架的使用附从相簿中获取图片

    首先发布Demo链接 Photos从相簿中获取图片 效果展示 一 Photos简介 在iOS 8之前 开发者只能用 AssetsLibrary 框架访问的用户的照片库 几年以来 相机应用和照片应用发生了显著的变化 增加了许多新特性 包括按时
  • invalid Key or Package

    使用EasyAR打包apk后出现invalid Key or Packag解决方案 1 Bundle ID IOS 和 PackageName Android 填写的对不对 2 回头看Unity里面Player Setting 里面的名字可
  • Qt 文件读写操作

    转载 http blog csdn net ei nino article details 7301132 文列出Qt读写文件常用方式 还有对文件的一些简单操作 读文件 cpp view plain copy print QString f
  • day28 回溯

    39 组合总和 数字可以被无限制选取 但是无需考虑顺序 组合 因此递归还是需要考虑startIdx 但是每次都从最开始进行回溯 而不是startIdx 1 40 组合总和II 通过标识去除重复值 树层去重 131 分割回文串 每次找到切割点