回溯 | Java | LeetCode 39, 40, 131 做题总结

news2024/11/25 14:17:27

Java

Arrays.sort(数组) //排序
不讲究顺序的解答,都可以考虑一下排序是否可行。

39. 组合总和

错误解答

在写的时候需要注意,sum -= candidates[i];很重要,也是回溯的一部分。
解答重复了。是因为回溯的for循环理解错了。

class Solution {
    List<List<Integer>> res = new ArrayList<List<Integer>>();
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        backtracking(candidates, target, 0, 0);
        return res;
    }

    List<Integer> path = new ArrayList<>();
    public void backtracking(int[] candidates, int target, int sum, int index) {
        if(sum > target) {
            return;
        }
        if(sum == target) {
            res.add(new ArrayList<>(path));
            return;
        }

        for(int i=0; i<candidates.length; i++) {
            sum += candidates[i];
            path.add(candidates[i]);

            backtracking(candidates,target,sum,i);
            
            sum -= candidates[i];
            path.remove(path.size()-1);
        }
    }
}

在这里插入图片描述

正确

  • 修改成下面这样就对了
    在这里插入图片描述

优化

不讲究顺序的解答,都可以考虑一下排序是否可行。
剪枝要先排序。

class Solution {
    List<List<Integer>> res = new ArrayList<List<Integer>>();
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        Arrays.sort(candidates);
        backtracking(candidates, target, 0, 0);
        return res;
    }

    List<Integer> path = new ArrayList<>();
    public void backtracking(int[] candidates, int target, int sum, int index) {
        if(sum == target) {
            res.add(new ArrayList<>(path));
            return;
        }

        for(int i=index; i<candidates.length; i++) {
            sum += candidates[i];
            if (sum > target) break;
            path.add(candidates[i]);

            backtracking(candidates,target,sum,i);

            sum -= candidates[i];
            path.remove(path.size()-1);
        }
    }
}

40.组合总和II

在这里插入图片描述

错误解法

想得太简单了……

class Solution {
    List<List<Integer>> res = new ArrayList<List<Integer>>();
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        Arrays.sort(candidates);
        back(candidates,target,0,0);
        return res;
    }

    List<Integer> path = new ArrayList<>();
    void back(int[] candidates, int target, int sum, int index) {
        if(sum > target) return;
        if(sum == target) {
            res.add(new ArrayList(path));
        }
        for(int i=index; i<candidates.length; i++) {
            path.add(candidates[i]);
            sum+=candidates[i];
            back(candidates,target,sum,index+1);
            sum-=candidates[i];
            path.remove(path.size()-1);   
        }
    }
}

与之前题目的区别

之前这两题,原本的数组中的元素是不重复的。但本题(40)是重复的,也就是说,[1,1,7],target=8那会有两种情况[1,7] [1,7],但这个答案是重复的,需要去重。
在这里插入图片描述
在这里插入图片描述

正确解法

本题中可以有重复的元素,因为数组中的元素是重复的。
去重是在同一树层中去除。但树层中怎么去重呢?用到了use数组。
在这里插入图片描述

class Solution {
    List<List<Integer>> res = new ArrayList<List<Integer>>();
    Boolean[] used;
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        used = new Boolean[candidates.length];
        Arrays.fill(used, false);
        Arrays.sort(candidates);
        back(candidates,target,0,0);
        return res;
    }

    List<Integer> path = new ArrayList<>();
    void back(int[] candidates, int target, int sum, int index) {
        if(sum == target) {
            res.add(new ArrayList(path));
        }
        for(int i=index; i<candidates.length; i++) {
            if(i>0 && candidates[i]==candidates[i-1] && !used[i-1]) {
                continue;
            }
            if(sum > target) break; //去重-树枝
            path.add(candidates[i]);
            sum+=candidates[i];
            used[i] = true;

            back(candidates,target,sum,i+1);
            sum-=candidates[i];
            used[i] = false;
            path.remove(path.size()-1);   
        }
    }
}

思考:代码中,这个continue什么意思?这里可不可以写return?不可以。
在这里插入图片描述

131.分割回文串

那么难究竟难在什么地方呢?

切割问题可以抽象为组合问题
如何模拟那些切割线
切割问题中递归如何终止
在递归循环中如何截取子串
如何判断回文
在这里插入图片描述

  • 注意
    第二十行,为什么还要continue?
    因为ab不是回文,没准aba就是了。
    而且也不用担心当前不是回文,之后不是怎么办,因为可以切割出单个字符
class Solution {
    List<List<String>> res = new ArrayList<>();
    List<String> path = new ArrayList<>();

    public List<List<String>> partition(String s) {
        backtracking(s,0);
        return res;
    }

    void backtracking(String s, int startIndex) {
        if(startIndex == s.length()) {
            res.add(new ArrayList(path));
            return;
        }
        for(int i=startIndex; i<s.length(); i++) {
            if(ishuiwen(s,startIndex,i)) {
                String str = s.substring(startIndex, i + 1);
                path.add(str);
            } else {
                continue;
            }
            backtracking(s,i+1);
            path.removeLast();
        }
    }
    Boolean ishuiwen(String s, int left, int right) {
        for(int i=left,j=right; i<=j; i++, j--) {
            if(s.charAt(i) != s.charAt(j)) {
                return false;
            }
        }
        return true;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1888325.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【大模型能力分水岭数学考试,文心一言超gpt4o排名第一】

文末有福利&#xff01; 2024年全国高考成绩陆续放榜&#xff0c;各位考生的成绩怎么样&#xff1f;在本次考试中还有几位特殊的考生——国内外知名的9个AI大模型也“参与”了本次高考&#xff0c;它们的成绩可谓也是“几家欢喜&#xff0c;几家愁”。 以河北省录取分数线&…

深圳数据中心机房搬迁准备

在互联网高度发达的今天&#xff0c;作为业务系统基础设施承载者&#xff0c;数据中心也得到了长足的发展和进步。随着信息系统规模逐渐扩大&#xff0c;应用功能的增多&#xff0c;过去建造的数据中心的面积、配套设施的各个方面都不能满足需求了。大多数使用者需要搬迁到新的…

Android 11.0 SettingsProvider 源码分析

文章目录 一、SettingsProvider 的概述二、SettingsProvider 的启动流程三、对 SettingsProvider 进行操作方法四、客制化示例 一、SettingsProvider 的概述 SettingsProvider 是一个为 Android 系统设置提供数据共享的 Provider&#xff0c;它包含全局、安全和系统级别的用户…

Linux屏幕驱动开发调试笔记

引言 首先了解下什么是MIPI-DSI&#xff1a; MIPI-DSI是一种应用于显示技术的串行接口&#xff0c;兼容DPI(显示像素接口&#xff0c;Display Pixel Interface)、DBI(显示总线接口&#xff0c;Display Bus Interface)和DCS(显示命令集&#xff0c;Display Command Set)&#…

Tech Talk:智能电视eMMC存储的五问五答

智能电视作为搭载操作系统的综合影音载体&#xff0c;以稳步扩大的市场规模走入越来越多的家庭&#xff0c;成为人们生活娱乐的重要组成部分。存储部件是智能电视不可或缺的组成部分&#xff0c;用于保存操作系统、应用程序、多媒体文件和用户数据等信息。智能电视使用eMMC作为…

前端FCP指标优化

优化前 第三方依赖按需引入之后&#xff0c;打包的总体积减小到初始值的55%&#xff0c;但是依然存在很大的js文件&#xff0c;需要继续优化 chunk-vendors.js进行分包之后 截图 compression-webpack-plugin压缩之后 截图

【MySQL备份】Percona XtraBackup总结篇

目录 1.前言 2.问题总结 2.1.为什么在恢复备份前需要准备备份 2.1.1. 保证数据一致性 2.1.2. 完成崩溃恢复过程 2.1.3. 解决非锁定备份的特殊需求 2.1.4. 支持增量和差异备份 2.1.5. 优化恢复性能 2.2.Percona XtraBackup的工作原理 3.注意事项 1.前言 在历经了详尽…

大语言模型系列-Transformer(二)

Transformer 模型的入门可以从以下几个方面开始&#xff1a; 1. 理解基本概念 序列到序列&#xff08;Sequence-to-Sequence&#xff09;任务&#xff1a;Transformer 模型主要用于这类任务&#xff0c;如机器翻译、文本摘要等。注意力机制&#xff08;Attention Mechanism&a…

使用dot来画流程图

Dot是一种图形描述语言&#xff0c;属于Graphviz软件的一部分。Graphviz是一个用于可视化图形&#xff08;图表、网络图等&#xff09;的开源工具集。使用Dot语言&#xff0c;你可以创建并描述节点和边&#xff0c;从而生成图形。以下是如何使用Dot语言画图的基本步骤&#xff…

Elasticsearch实战教程: 如何在海量级数据中进行快速搜索

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 Elasticsearch&#xff08;简称ES&#xff09;是一个基于Apache Lucene™的开源搜索引擎&#xff0c;无论在开源还是专有领…

matlab仿真 通信信号和系统分析(下)

&#xff08;内容源自详解MATLAB&#xff0f;SIMULINK 通信系统建模与仿真 刘学勇编著第三章内容&#xff0c;有兴趣的读者请阅读原书&#xff09; 一、离散傅里叶变换 clear all n0:30;%信号的时间范围 xsin(0.2*n).*exp(-0.1*n); k0:30;%频率范围 N31; Wnkexp(-j*2*pi/N).…

firewalld(6)自定义services、ipset

简介 在前面的文章中我们已经介绍了zone、rich rule 、--direct等功能和基本配置。在前面文章中&#xff0c;我们提到过firewalld内置了很多服务&#xff0c;可以通过firewall-cmd --get-services来查看服务&#xff0c;也可以通过配置文件查看这些服务/var/lib/firewalld/ser…

短视频电商源码的优势及软件架构解析

短视频电商源码是目前电商行业中非常火热的一个新兴领域&#xff0c;它通过短视频内容和电商商品的结合&#xff0c;为用户提供了一种新的购物体验。下面将介绍短视频电商源码的优势以及软件架构。 首先&#xff0c;短视频电商源码具有以下几个优势&#xff1a; 1、创新的购物体…

WGAN(Wassertein GAN)

WGAN E x ∼ P g [ log ⁡ ( 1 − D ( x ) ) ] E x ∼ P g [ − log ⁡ D ( x ) ] \begin{aligned} & \mathbb{E}_{x \sim P_g}[\log (1-D(x))] \\ & \mathbb{E}_{x \sim P_g}[-\log D(x)] \end{aligned} ​Ex∼Pg​​[log(1−D(x))]Ex∼Pg​​[−logD(x)]​ 原始 GAN …

项目范围管理(信息系统项目管理师)

收集需求的输出是需求文件、需求跟踪矩阵定义范围是制定项目和产品详细描述的过程。本过程的主要作用是描述产品、服务或成果的边界和验收标准。本过程需要在整个项目期间多次反复开展项目范围说明书&#xff1a;是对项目范围、主要可交付成果、假设条件和制约因素的描述。明确…

思维导图插件--jsMind的使用

vue引入jsmind&#xff08;右键菜单&#xff09;_jsmind.menu.js-CSDN博客 第一版 vue-JsMind思维导图实现&#xff08;包含鼠标右键自定义菜单&#xff09;_jsmind 右键菜单-CSDN博客 // 新增节点addNode() {console.log(this.get_selected_nodeid());this.get_selected_…

Jenkins 创建流水线任务

Jenkins是一个流行的持续集成&#xff08;Continuous Integration&#xff0c;CI&#xff09;工具。 Jenkins 创建任务 选择“流水线”类型&#xff0c;该类型的优点是定制化程度非常高 &#xff08;可选&#xff09;添加“参数化构建” 配置仓库选项(ssh连接、分支)和凭据…

Element-UI - el-table中自定义图片悬浮弹框 - 位置优化

该篇为前一篇“Element-UI - 解决el-table中图片悬浮被遮挡问题”的优化升级部分&#xff0c;解决当图片位于页面底部时&#xff0c;显示不全问题优化。 Vue.directive钩子函数已在上一篇中详细介绍&#xff0c;不清楚的朋友可以翻看上一篇&#xff0c; “Element-UI - 解决el-…

【Python】字典练习

python期考练习 目录 1. 首都名​编辑 2. 摩斯电码 3. 登录 4. 学生的姓名和年龄​编辑 5. 电商 6. 学生基本信息 7. 字母数 1. 首都名 初始字典 (可复制) : d{"China":"Beijing","America":"Washington","Norway":…

企业如何管理安全生产工作?(附模板)

总结一下在企业内管理安全中遇到的一些问题&#xff1a; 1、 管理方式落后&#xff0c;还在使用纸质记录 2、 人员信息杂乱无章&#xff0c;无人整理 3、出现问题找不到源头和负责人 我做系统管理已经7年了&#xff0c;题主说的这些问题我之前也遇到过&#xff0c;相信也有…