LeetCode 热题 100(九):回溯复习。77. 组合、17. 电话号码的字母组合、39. 组合总和

news2024/11/21 0:32:09

题目一:

77. 组合

思路:

思路:回溯算法。使用回溯三部曲进行解题:

1.递归函数的返回值以及参数:n,k,startIndex(记录每次循环集合从哪里开始遍历的位置),其中startIndex 就是防止出现重复的组合。比如从1开始了循环,则使用startindex=2,让startindex作为下次循环的开始。

还有全局变量:一个是用来存放一个符合条件的结果path,一个用来存放所有符合条件的结果集合result。

2.回溯函数终止条件:path这个数组的大小如果达到k,说明我们找到了一个子集大小为k的组合,在图中path存的就是根节点到叶子节点的路径

3.单层搜索的过程:for循环用来横向遍历,递归的过程是纵向遍历。
代码:

class Solution {
    // 存放单个结果path, 存放所有结果res
    List<List<Integer>> res = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
    public List<List<Integer>> combine(int n, int k) {
        combineHelper(n, k, 1);
        return res;
    }
    
    // startindex就是循环开始位置
    private void combineHelper(int n, int k, int startindex) {
        // 终止条件 
        if (path.size() == k){
            res.add(new ArrayList<>(path));
            return;
        }
        // 单层逻辑
        for (int i = startindex; i <= n ; i++ ){
            path.add(i);
            combineHelper(n, k, i + 1);
            path.removeLast();
        }
    }
}

题目二:

17. 电话号码的字母组合

思路:同组合。不过换成了对字符串的使用,细节见代码。

代码:

class Solution {
    // 存储结果的集合
    List<String> res = new ArrayList<>();
    // 存储结果,类似组合问题中的path
    StringBuilder temp = new StringBuilder();
    public List<String> letterCombinations(String digits){
        // 初始判断
        if (digits.length() == 0 || digits == null) return res;
        // 先设置好电话号码对应的字母
        String[] numString = {"","","abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
        zimuzuhe(digits, numString, 0);
        return res;
    }
    // s代表输入的数字,
    private void zimuzuhe(String s, String[] numString, int num) {
        // temp.length 也可以换成 num,我习惯比较path.size与k的使用, temp.length等同于path.size,k等同于s.length
        if (temp.length() == s.length()){
            res.add(temp.toString());
            return;
        }
        // num指代的是字符串中数字的位置索引,比如“23”,num会分别等于0,1。因为是使用charAt去获取的str
        String str = numString[s.charAt(num) - '0'];
        for (int i = 0; i < str.length(); i++){
            temp.append(str.charAt(i));
            zimuzuhe(s, numString, num + 1);
            temp.deleteCharAt(temp.length() - 1);

        }
    }
}

题目三;

39. 组合总和

思路:回溯。但因为本题区别普通组合问题可以重复使用数字,需要对startIndex进行调整

代码:

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
    public List<List<Integer>> combinationSum(int[] candidates, int target){
        if (candidates.length == 0) return res;
        // 排序,以防重复,因为每个数字可以多次取
        Arrays.sort(candidates);
        // 用于判断总和
        int sum = 0;
        // 每次循环的起始位置
        int startIndex = 0;
        sum_zuhe(candidates, target, sum, startIndex);
        return res;
    }

    private void sum_zuhe(int[] candidates, int target, int sum, int startIndex) {
        // 总和判断
        if (sum == target){
            res.add(new ArrayList<>(path));
            return;
        }
        // 虽然可以重复使用数字,但仍然是组合问题,只是每次的起始点不再+1
        for (int i = startIndex; i < candidates.length; i++){
            if (sum + candidates[i] > target) break;
            
            path.add(candidates[i]);
            sum += candidates[i];
            // 使用i为起始点,不再i+1,因为可重复使用
            sum_zuhe(candidates, target, sum, i);
            sum -= candidates[i];
            path.removeLast();
        }
    }
}

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

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

相关文章

【管理运筹学】第 8 章 | 动态规划(1,多阶段决策过程与动态规划基本概念)

文章目录 引言一、多阶段决策过程及实例二、动态规划的基本概念和方法2.1 动态规划的基本概念 写在最后 引言 倒回来学动态规划&#xff0c;网络计划和排队论先放到后面吧。 动态规划是解决多阶段决策过程最优化问题的一种方法。该方法由美国数学家贝尔曼等人在 20 世纪 50 年…

网安之python基础作业(2-3)

目录 目录 前言 系列文章列表 网安之python基础学习作业(1) 思维导图 1&#xff0c;网安之python基础学习作业(2) 1.1,作业一: 1.1.1,题目 1.1.2,题解 1.2&#xff0c;作业二: 1.2,1,题目 1.2.2,题解 2&#xff0c;网安之python基础学习作业(3) 2.1,作业1 2.1…

【面向对象的三大基本特征与五大基本原则】

文章目录 面向对象的三大基本特征与五大基本原则一、三大基本特征&#xff1a;封装、继承、多态1、封装2、继承3、多态 二、五大基本原则1、单一职责原则&#xff08;SRP&#xff09;2、开放封闭原则&#xff08;OCP&#xff09;3、里氏替换原则&#xff08;LSP&#xff09;4、…

免费:CAD批量转PDF工具,附下载地址

分享一款CAD 批量转PDF、打印的工具插件。能自动识别图框大小、自动识别比例、自动编号命名。重点&#xff01;重点&#xff01;重点&#xff01;自动将CAD的多张图纸一次性地、批量地转为PDF&#xff0c;或者打印。效果看下图&#xff1a; 适用环境&#xff1a; 32位系统 Auto…

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— JS基础(二)

人生是旷野&#xff0c;不是轨道。 思维导图 一、运算符 1.1 赋值运算符 1.2 一元运算符 1.3 比较运算符 1.4 逻辑运算符 逻辑与&#xff0c;一假则假 逻辑或&#xff0c;一真则真 <!DOCTYPE html> <html lang"en"><head><meta charset&quo…

李沐机器学习入门

文章目录 1.数据的获取2.数据的爬取3.数据的标注3.1 半监督学习3.1.1 自学习算法3.1.2 人工标注数据3.1.3 弱监督学习 4.数据的预处理5. 数据的清理6. 数据的变换7.特征工程8.机器学习介绍8.1 决策树模型8.2 线性模型线性模型做回归线性模型做分类Softmax回归 8.3 小批量随机梯…

线性代数基础-行列式

一、行列式之前的概念 1.全排列&#xff1a; 把n个不同的元素排成一列&#xff0c;称为n个元素的全排列&#xff0c;简称排列 &#xff08;实际上就是我们所说的排列组合&#xff0c;符号是A&#xff0c;arrange&#xff09; 2.标准序列&#xff1a; 前一项均小于后一项的序列…

输入学生成绩,函数返回最大元素的数组下标,求最高分学生成绩(输入负数表示输入结束)

scanfscore()函数用于输入学生的成绩 int scanfscore(int score[N])//输入学生的成绩 {int i -1;do {i;printf("输入学生成绩:");scanf("%d", &score[i]);} while (score[i] > 0);return i; } findmax()用于寻找最大值 int findmax(int score[N…

【Spring】BeanName 的自动生成原理

&#x1f388;博客主页&#xff1a;&#x1f308;我的主页&#x1f308; &#x1f388;欢迎点赞 &#x1f44d; 收藏 &#x1f31f;留言 &#x1f4dd; 欢迎讨论&#xff01;&#x1f44f; &#x1f388;本文由 【泠青沼~】 原创&#xff0c;首发于 CSDN&#x1f6a9;&#x1f…

华为云云耀云服务器L实例评测|搭建Domain Admin环境监控公司网站的SSL证书,实现到期提醒

本文基于华为云云耀云服务器L实例下的场景体验开源软件Domain Admin的安装部署&#xff0c;实现SSL证书的到期提醒 目录 1、购买华为云耀云服务器L实例2、登录服务器2.1、重置密码2.2、连接服务器 3、安装Domain Admin3.1、检查Python3.2、检查pip3.3、安装Domain Admin3.4、启…

VUE之proxy配置实现跨域

什么是跨域 要了解跨域&#xff0c;首先得知道浏览器的同源策略。 同源策略&#xff1a;是由Netscape提出的一个安全策略&#xff0c;能够阻挡恶意文档&#xff0c;保护本地数据。它能限制一个源的文档或脚本对另一个源的交互&#xff0c;使得其它源的文档或脚本&#xff0c;…

皮克定理和多边形面积及应用

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 皮克定理 皮克定理&#xff1a;皮克定理是指一个计算所有顶点坐标为整数的多边形面积公。该公式可以表示为Sab2&#xff0d;1&#xff0c;其中a表示多边形内部的坐标为…

Python list列表添加元素的3种方法

实际开发中&#xff0c;经常需要对​ Python 列表 ​进行更新&#xff0c;包括向列表中添加元素、修改表中元素以及删除元素。本节先来学习如何向列表中添加元素。 使用运算符可以将多个序列连接起来&#xff1b;列表是序列的一种&#xff0c;所以也可以使用进行连接&#xff0…

Linux配置成代理服务器

Linux配置成代理服务器 什么是代理服务器 把Linux配置成代理服务器 开放的代理服务器 升级需要账号密码的代理服务器 Linux系统使用代理服务器 临时通过代理访问 永久通过代理访问 Windows系统使用代理服务器 什么是代理服务器 代理服务器&#xff08;Proxy Server&am…

《动手学深度学习 Pytorch版》 4.5 权重衰减

4.5.1 范数与权重衰减 整节理论&#xff0c;详见书本。 4.5.2 高维线性回归 %matplotlib inline import torch from torch import nn from d2l import torch as d2l# 生成一些数据&#xff0c;为了使过拟合效果更明显&#xff0c;将维数增加到 200 并使用一个只包含 20 个样…

vue3中使用el-upload + tui-image-editor进行图片处理

效果如下 看之前请先看上一篇《vue3中使用组件tui-image-editor进行图片处理》中的 1、第一步安装 2、第二部封装组件 本篇只是在这基础上结合el-upload使用组件 3、第三步结合el-upload使用组件 <template><el-dialog:title"dialogTitle":modelValue&qu…

004-Windows下开发环境搭建

Windows下开发环境搭建 文章目录 Windows下开发环境搭建项目介绍版本控制工具Git 与 SVNWindow下安装Git Qt 开发工具静态编译Qt环境安装 串口模拟器比较工具SQLite 数据库查看小工具预告 关键字&#xff1a; Qt、 Qml、 开发环境、 Windows、 C 项目介绍 欢迎来到我们的 …

Elastic Universal Profiling™ 是一种连续分析解决方案,现已正式上市

作者&#xff1a;Israel Ogbole, Stephanie Boomsma 在软件无处不在且影响深远的世界中&#xff0c;效率的重要性不仅仅局限于业务范围。 高效的软件不仅有利于企业&#xff0c;而且有利于企业。 这对全球也有好处。 通过将计算效率作为核心目标&#xff0c;并为专业人员提供正…

WebGL光照介绍——平行光、环境光下的漫反射

目录 光照原理 光源类型 平行光 点光源 环境光 反射类型 漫反射 漫反射光颜色 计算公式 环境反射 环境反射光颜色 表面的反射光颜色&#xff08;漫反射和环境反射同时存在时&#xff09;计算公式 平行光下的漫反射 根据光线和法线方向计算入射角θ&#xff08;以便…

数据结构--哈希表,哈希函数(或者散列表、散列函数)

目录 哈希表的定义 处理冲突的方法--拉链法 散列查找 常见的散列函数&#xff08;构造哈希函数&#xff09; 除留余数法 直接定址法 数字分析法 平方取中法 处理冲突的方法--开放定址法 &#xff08;1&#xff09;线性探测法&#xff1a; &#xff08;2&#xff09…