LeetCode —— 回溯

news2024/11/24 20:12:57

77. 组合

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。

示例:输入:n = 4, k = 2         输出: [ [1,2], [1,3], [1,4], [2,3], [2,4], [3,4]]

class Solution {
    List<List<Integer>> list = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();

    public List<List<Integer>> combine(int n, int k) {
        backTrack(n, k, 1);
        return list;
    }

    public void backTrack(int n, int k, int startIndex){
        if(path.size() == k){
            list.add(new ArrayList<>(path));
            return;
        }
        for(int i = startIndex; i <= n; i++){
            path.add(i);
            backTrack(n, k, i + 1);
            path.removeLast();
        }
    }
}

17. 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例:输入:digits = "23"         输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

class Solution {
    List<String> list = new ArrayList<>();
    StringBuilder item = new StringBuilder();

    public List<String> letterCombinations(String digits) {
        if(digits.length() == 0){
            return list;
        }
        String[] numberString = new String[]{"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
        backTrack(digits, numberString, 0);
        return list;
    }

    public void backTrack(String digits, String[] numberString, int index){
        if(item.length() == digits.length()){
            list.add(item.toString());
            return;
        }

        String cur = numberString[digits.charAt(index) - '0'];
        for(int i = 0; i < cur.length(); i++){
            item.append(cur.charAt(i));
            backTrack(digits, numberString, index + 1);
            item.deleteCharAt(item.length() - 1);
        }
    }
}

216. 组合总和III

找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:(1)只使用数字1到9;(2)每个数字 最多使用一次 。返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

示例:输入: k = 3, n = 9         输出: [[1,2,6], [1,3,5], [2,3,4]]

class Solution {
    List<List<Integer>> list = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();

    public List<List<Integer>> combinationSum3(int k, int n) {
        backTrack(k, n, 1, 0);
        return list;
    }

    public void backTrack(int k, int targetSum, int startIndex, int sum){
        if(sum > targetSum || path.size() > k){
            return;
        }
        if(path.size() == k && sum == targetSum){
            list.add(new ArrayList<>(path));
            return;
        }

        for(int i = startIndex; i <= 9; i++){
            path.add(i);
            sum += i;
            backTrack(k, targetSum, i + 1, sum);
            path.removeLast();
            sum -= i;
        }
    }
}

39.  组合总和

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。 

示例:输入:candidates = [2,3,6,7], target = 7         输出:[[2,2,3],[7]]

class Solution {
    List<List<Integer>> list = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();

    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        Arrays.sort(candidates);
        backTrack(candidates, target, 0, 0);
        return list;
    }

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

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

40. 组合总和II

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 。

示例:输入: candidates = [10,1,2,7,6,1,5], target = 8       输出: [ [1,1,6], [1,2,5], [1,7], [2,6] ]

class Solution {
    List<List<Integer>> list = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();

    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        Arrays.sort(candidates);
        backTrack(candidates, target, 0, 0);
        return list;
    }

    public void backTrack(int[] candidates, int target, int startIndex, int sum){
        if(sum == target){
            list.add(new ArrayList<>(path));
            return;
        }

        for(int i = startIndex; i < candidates.length; i++){
            if(sum + candidates[i] > target){
                break;
            }
            // 跳过同一层使用过的元素
            if(i > startIndex && candidates[i] == candidates[i - 1]){
                continue;
            }
            path.add(candidates[i]);
            sum += candidates[i];
            backTrack(candidates, target, i + 1, sum);
            sum -= candidates[i];
            path.removeLast();
        }
    }
}

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

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

相关文章

【面试经典150 | 数组】H 指数

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;排序方法二&#xff1a;二分方法三&#xff1a;计数排序 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&am…

java-普通项目中多个模块间的引用

背景&#xff1a; 项目下面有一个common的模块&#xff0c;其他模块引用 现象&#xff1a; 当class文件直接在src下面的时候 其他模块引用解析不了 当class文件在allUtils的时候是可以解析的

外包公司干了2个月,整个人不思进取了...

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入深圳某软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年8月份&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了三年的功能测试…

我用PYQT5做的第一个实用的上位机项目(二)

从这篇开始&#xff0c;复盘整个的过程&#xff0c;做一个记录。 首先&#xff0c;制作一些自定义的常用部件&#xff0c;原生的部件很粗糙。 一、按钮的图片资源&#xff1a;用绘图软件&#xff08;例如AI、coreldraw、PS等&#xff0c;看自己的熟悉程度&#xff09;制作按钮…

泰国数字加密平台Bitkub创始人到访和数集团:以数字化创新探索科技前沿密码

9月21日&#xff0c;泰国数字加密货币交易平台Bitkub创始人兼首席执行官&#xff08;CEO&#xff09;Jirayut Srupsrisopa (Topp)先生到访上海和数集团&#xff0c;在和数集团董事长唐毅陪同下实地参观了和数集团上海总部&#xff0c;听取了和数集团在引领前沿数字化创新&#…

怒刷LeetCode的第18天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;置换 方法二&#xff1a;哈希集合 方法三&#xff1a;递归 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;双指针法 方法二&#xff1a;动态规划 方法三&#xff1a;栈 方法四&#xff1a;两…

数字乡村包括哪些方面?数字乡村应用介绍

数字乡村是指利用物联网、数字化和智能化技术&#xff0c;借助现代数字智能产品、高效信息服务和物联网基础设施&#xff0c;以提高农村居民生活质量&#xff0c;助力拓展经济发展前景。 创建数字村庄有助于缩小城乡社区之间的差距&#xff0c;保障每个人都能平等地享受科技发展…

LabVIEW开发低成本静脉监测和控制输液系统

LabVIEW开发低成本静脉监测和控制输液系统 信息技术的使用和进步彻底改变了现代医疗保健的面貌。医院、疗养院和其他姑息治疗院需要不同的人力资源&#xff0c;如医生、技术人员、护士和其他工作人员&#xff0c;他们共同提供最先进的医疗保健。COVID-19大流行表现出严重缺乏此…

安全厂商安恒信息加入龙蜥社区,完成 与 Anolis OS 兼容适配

近日&#xff0c;杭州安恒信息技术股份有限公司&#xff08;以下简称“安恒信息”&#xff09;签署了 CLA&#xff08;Contributor License Agreement&#xff0c;贡献者许可协议&#xff09;&#xff0c;正式加入龙蜥社区&#xff08;OpenAnolis&#xff09;&#xff0c;并成为…

2023-9-27 JZ77 按之字型顺序打印二叉树

题目链接&#xff1a;按之字型顺序打印二叉树 import java.util.*;/** public class TreeNode {* int val 0;* TreeNode left null;* TreeNode right null;* public TreeNode(int val) {* this.val val;* }* }*/public class Solution {/*** 代码中的类名、方…

阿里云服务器企业级独享和共享型有什么区别?

阿里云ECS云服务器共享型和企业级有什么区别&#xff1f;企业级就是独享型&#xff0c;共享型和企业级云的主要区别CPU调度模式&#xff0c;共享型是非绑定CPU调度模式&#xff0c;企业级是固定CPU调度模式&#xff0c;共享型云服务器在高负载时计算性能可能出现波动不稳定&…

恋爱聊天追女神沟通话术小程序开发演示

现在什么最有市场&#xff1f;婚恋、交友、恋爱…… 单身多需求就自然而然的产生了&#xff0c;而且还很大。我们可以搜素查看各平台这类项目的流量&#xff0c;基本都不低。 因此针对细分领域开发两款恋爱聊天沟通话术小程序&#xff0c;一款为本地数据版&#xff0c;一款为…

携手华为使能全场景创新,夯实算力底座,麒麟信安受邀参加华为全联接大会2023

智能化浪潮正奔腾而来&#xff0c;驱动千行百业锚定新航向、跑出加速度。日前&#xff0c;第八届华为全联接大会&#xff08;HUAWEI CONNECT 2023&#xff09;在上海举办。大会邀请思想领袖、商业精英、技术专家、合作伙伴、开发者等业界同仁&#xff0c;从商业、产业、生态等方…

设计模式1、单例模式 Singleton

解释说明&#xff1a;确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问这个唯一实例 要点如下 有且仅有一个实例 必须自行创建自己的唯一实例 必须给所有其他对象提供这一实例 具体实现要点如下 提供一个 private 构造函数&#xff08;防止外部调用而构造类的实例…

还在用 !=null 判空?让我们用Java8的全新API去优化代码吧

当我们编写Java代码时&#xff0c;经常需要处理空值&#xff08;null&#xff09;&#xff0c;因为空值可能导致NullPointerException异常&#xff0c;这是一个常见的运行时异常。在Java 8中&#xff0c;引入了Optional类来更优雅地处理可能为空的值&#xff0c;从而减少NullPo…

NOSQL Redis十大数据类型

String 字符串 string 是redis最基本的类型&#xff0c;而是使用最多的数据类型&#xff0c; 一个 key 对应一个 value string 类型是 二进制安全的&#xff0c;意思reidis 的string 可以包含任何数据&#xff08;任何数据都可以转换binary的&#xff09;&#xff0c;比如jpg图…

推荐一个好用的电商开源项目yudao源码

1、项目下载cloneruoyi-vue-pro: &#x1f525; 官方推荐 &#x1f525; RuoYi-Vue 全新 Pro 版本&#xff0c;优化重构所有功能。基于 Spring Boot MyBatis Plus Vue & Element 实现的后台管理系统 微信小程序&#xff0c;支持 RBAC 动态权限、数据权限、SaaS 多租户、…

使用日志分析工具了解网络情况

日志分析&#xff08;或日志文件分析&#xff09;是检查整个网络中生成的日志数据的过程&#xff0c;日志数据从各种来源生成&#xff0c;包括外围设备、工作站、服务器、应用程序以及其他硬件和软件组件&#xff0c;将它们收集到一个中心位置并进行分析&#xff0c;可以为了解…

提升工作效率的一些网站、应用、插件和小技巧(二)

前言 距离发布提升工作效率的一些网站、应用、插件和小技巧&#xff08;一&#xff09;已经过去了三年&#xff0c;这次再分享一下这三年里新 Get 到的一些工作、技巧&#xff0c;欢迎各位在评论区也分享一下自己使用的工具软件等&#xff0c;也希望下一个三年我还能继续坚持分…

蓝桥杯每日一题2023.9.28

AcWing 4409. 砍竹子 - AcWing 题目描述 题目分析 注&#xff1a;sqrtl的范围为long double&#xff0c;比sqrt更加精确 使用优先队列维护一段区间&#xff0c;如果连续一段相同就合并为一个区间&#xff0c;从大到小去枚举&#xff0c;每次先取出最大的一段&#xff0c;双…