算法刷刷刷| 回溯篇| 组合问题大集合

news2024/9/28 1:17:12

77.组合

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。

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

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

class Solution {

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

    private List<Integer> path = new ArrayList<>();

    private List<List<Integer>> res = new ArrayList<>();

    private void backTrack(int start, int n, int k) {
        if (path.size() == k) {
            res.add(new ArrayList<>(path));
            return;
        }
        for (int i = start; i <= n - (k - path.size()) + 1; i++) {
            path.add(i);
            backTrack(i + 1, n, k);
            path.remove(path.size() - 1);
        }
    }
}

216.组合总和III

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

示例 1:
输入: k = 3, n = 7
输出: [[1,2,4]]
解释:
1 + 2 + 4 = 7
没有其他符合的组合了。

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

class Solution {

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

    private List<Integer> path = new ArrayList<>();

    private List<List<Integer>> res = new ArrayList<>();

    private void backTrace(int start, int sum, int n, int k) {
        if (path.size() == k && sum == n) {
            res.add(new ArrayList<>(path));
            return;
        }
        for (int i = start; i <= 9 - (k - path.size()) + 1 && sum < n; i++) {
            path.add(i);
            sum += i;
            backTrace(i + 1, sum, n, k);
            sum -= i;
            path.remove(path.size() - 1);
        }
    }
}

17.电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

在这里插入图片描述
输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]

public List<String> letterCombinations(String digits) {
        if (digits.equals("")) {
            return new ArrayList<>();
        }
        Map<String, String> map = new TreeMap<>();
        map.put("2", "abc");
        map.put("3", "def");
        map.put("4", "ghi");
        map.put("5", "jkl");
        map.put("6", "mno");
        map.put("7", "pqrs");
        map.put("8", "tuv");
        map.put("9", "wxyz");
        backTrace(0, digits, map);
        return res;
    }

    private List<String> res = new ArrayList<>();

    private StringBuilder sb = new StringBuilder();

    private void backTrace(int start, String s, Map<String, String> map) {
        if (sb.length() == s.length()) {
            res.add(new String(sb));
            return;
        }
        String tmpString = map.get(s.substring(start, start + 1));
        for (int i = 0; i < tmpString.length(); i++) {
            sb.append(tmpString.substring(i, i + 1));
            backTrace(start + 1, s, map);
            sb.delete(sb.length() - 1, sb.length());
        }
    }

39.组合总和

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

示例 1:
输入:candidates = [2,3,6,7], target = 7
输出:[[2,2,3],[7]]
解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合。

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

    private List<List<Integer>> res = new ArrayList<>();

    private List<Integer> path = new ArrayList<>();

    private void backTrace(int[] nums, int sum, int target, int start) {
        if (sum > target) {
            return;
        }
        if (sum == target) {
            res.add(new ArrayList<>(path));
            return;
        }
        for (int i = start; i < nums.length; i++) {
            sum += nums[i];
            path.add(nums[i]);
            backTrace(nums, sum, target, i);
            sum -= nums[i];
            path.remove(path.size() - 1);
        }
    }

这里要注意,题目中说数字无限选取,不是每次都能遍历12345…n(这样会出现[2,2,3],[2,3,2],[3,2,2]这样重复的数组),还是要有startIdx的,只不过比单次使用的回溯情况下,多了个纵向回溯时从自身开始(单次使用元素是从自身下一个开始)。

40.组合总和II

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

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

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

class Solution {

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

    private List<List<Integer>> res = new ArrayList<>();

    private List<Integer> path = new ArrayList<>();

    private void backTrace(int[] nums, int sum, int target, int start) {
        if (sum > target) {
            return;
        }
        if (sum == target) {
            res.add(new ArrayList<>(path));
            return;
        }
        for (int i = start; i < nums.length; i++) {
            if (i > start && nums[i] == nums[i - 1]) {
                continue;
            }
            sum += nums[i];
            path.add(nums[i]);
            backTrace(nums, sum, target, i + 1);
            sum -= nums[i];
            path.remove(path.size() - 1);
        }
    }
}

因为数组里有重复的数字,比如1,1,2,3,就会在第一个1和第二个1处各出现个[1,2,3],这样就重复了,所以要在回溯的过程中去重,怎么去重呢,因为for循环是管横向遍历的,递归是管纵向遍历的,所以在横向遍历数组的时候,去掉和前一个相同的元素,这里要非常注意条件if (i > start && nums[i] == nums[i - 1]) ,一定要i>start,因为start位置一定是要递归的,但是start后面与start位置相同的元素就要跳过了,千万别再写成i>1了…[1,1,2,5,6,7,10]这样的数组,i>1就没去掉第二个1,i>=1也不行,这样会把start去掉的

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

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

相关文章

可靠、稳定、安全,龙蜥云原生容器镜像正式发布!

文/云原生 SIG01背景随着云原生的蓬勃发展&#xff0c;越来越多的企业在自己的生产或者测试环境使用云原生技术&#xff0c;而容器镜像正是云原生技术中应用的实际运行环境。一个好的容器运行环境即容器镜像会真正关系到应用的体验、演进和维护。那么选择一个好的容器镜像需要考…

Flink实时同步MySQL与Doris数据

参考&#xff1a; 技术解析&#xff5c;Doris Connector 结合 Flink CDC 实现 MySQL 分库分表 Exactly Once 精准接入-阿里云开发者社区 逻辑图&#xff1a; 1. Flink环境&#xff1a; https://flink.apache.org/zh/ 下载flink-1.15.1 wget https://dlcdn.apache.org/flink…

并发编程之synchronized详解

目录 设计同步器的意义 如何解决线程并发安全问题&#xff1f; synchronized原理详解 synchronized底层原理 Monitor监视器锁 什么是monitor&#xff1f; 对象的内存布局 对象头 对象头分析工具 锁的膨胀升级过程 偏向锁 轻量级锁 自旋锁 锁消除 逃逸分析 设…

RabbitMQ学习(七):交换器

〇、前言在之前的内容中&#xff0c;我们创建了一个工作队列。我们假设的是工作队列背后&#xff0c;每个任务都恰好交付给一个消 费者(工作进程)。在今天的内容中&#xff0c;我们将做一些完全不同的事情——我们将消息传达给多个消费者。这种模式 称为 “发布/订阅”。为了说…

横板格斗类游戏实战:核心玩法介绍(一)

第一章讲解了横板格斗类游戏框架主要涉及到的一些模块设计与技术原理&#xff0c;本章节开始讲解横板格斗类游戏的玩法&#xff0c;美术资源与游戏的数值策划。我们以主要的截图为示意图&#xff0c;来把整个横板格斗类游戏的核心玩法和要实现的功能大致列一遍。对啦&#xff0…

QGIS中进行批量坡向计算

QGIS中进行坡向计算1. 坡向计算中的Z因子&#xff08;垂直单位与水平单位的比值&#xff09;2. 坡向计算步骤坡度计算的姊妹篇–坡向计算来了 1. 坡向计算中的Z因子&#xff08;垂直单位与水平单位的比值&#xff09; z 因子是一个转换因子&#xff0c;当输入表面的垂直坐标&…

BFC到底是什么?如何理解

BFC到底是什么&#xff1f; BFC全称&#xff1a;Block Formatting Context&#xff0c; 名为“块级格式化上下文”。 W3C官方解释&#xff1a;BFC 它决定了元素如何对其内容进行定位&#xff0c;以及与其他元素的关系和相互作用&#xff0c;当涉及到可视化布局时&#xff0c;B…

IMU调试方案

1.IMU 型号 QMI8658C IMU英文数据手册 参照连线与数据手册使用 类似的惯导模块开发https://www.cnblogs.com/rockyching2009/p/15071669.html 微雪 https://www.waveshare.net/wiki/RP2040-LCD-1.28 micro python &#xff1a;https://docs.micropython.org/en/latest/esp32/t…

ArcGIS API for JavaScript 4.15系列(7)——Dojo中的Ajax请求操作

1、前言 作为重要的前后端交互技术&#xff0c;Ajax被广泛应用于Web项目中。无论是jQuery时代的$.ajax还是Vue时代下的axios&#xff0c;它们都对Ajax做了良好的封装处理。而Dojo也不例外&#xff0c;开发者使用dojo/request模块可以轻松实现Ajax相关操作&#xff0c;下面开始…

UNP 简介

目录 从一个简单的时间获取客户端开始 socket 指定服务器 IP 地址与端口 与服务器建立连接并读取数据 简单的时间获取服务端 Unix 标准 从一个简单的时间获取客户端开始 接下来&#xff0c;将从一个使用 TCP 连接的获取时间的客户端开始。 // 以下代码与 UNP intro/dayt…

后台管理项目重构为vue3.0

目录前言&#xff1a;为什么要重构项目&#xff1f;重构的目的具体案例下载项目一. 为什么要重构后台管理项目二. 安装项目所需的vue3.0 插件三. 具体代码重构四. 在更改中遇到的bug总结前言&#xff1a; 我们平常玩的游戏有时需要更新出新的内容&#xff0c;我们的项目也需要…

组件化、模块化、集中式、分布式、服务化、面向服务的架构、微服务架构

目录 1.组件化与模块化 1.1.组件化 2.模块化 2.1.模块化和组件化的区别 3.集中式与分布式 3.1.集中式 3.2.分布式 4.服务化 5.面向服务的架构 5.1.什么是SOA 5.2.实现SOA 5.3.面向对象和面向服务的对比 6.微服务架构 6.1.SOA和微服务 7.总结 最近最火的词是什么…

1月份 GameFi 行业报告

Jan. 2023&#xff0c; DanielData Source&#xff1a; January Monthly GameFi Report在经历了艰难的一年之后&#xff0c;1 月是对加密货币市场最有利的月份。虽然可以说的大部分内容适用于其他看涨周期&#xff0c;但有几个统计数据令 1 月在区块链领域非常有趣。例如&#…

花3个月面过京东测开岗,拿个20K不过分吧?

背景介绍 计算机专业&#xff0c;代码能力一般&#xff0c;之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做前端开发&#xff0c;第二份实习由于大三暑假回国的时间比较短&#xff08;小于两个月&#xff09;&#xff0c;于是找的实习是在…

GPU并行效率问题——通过MPS提升GPU计算收益

现象描述使用V100_32G型号的GPU运行计算程序时&#xff0c;发现程序每5秒能够完成一次任务&#xff0c;耗费显存6G。鉴于V100 GPU拥有32G的显存&#xff0c;还有很多空闲&#xff0c;决定同时运行多个计算程序&#xff0c;来提升GPU计算收益。然而&#xff0c;这一切都是想当然…

Kotlin新手教程一(Kotlin简介及环境搭建)

目录一、 什么是Kotlin&#xff1f;二、为什么要使用Kotlin&#xff1f;三、使用IntelliJ IDEA搭建Kotlin四、Kotlin使用命令行编译一、 什么是Kotlin&#xff1f; Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言&#xff0c;它也可以被编译成为 JavaScript 源代码&…

IDEA入门安装使用教程

一、背景 作为一个Java开发者&#xff0c;有非常多编辑工具供我们选择&#xff0c;比如Eclipse、IntelliJ IDEA、NetBeans、Visual Studio Code、Sublime Text等等&#xff0c;这些有免费也有收费的&#xff0c;但是就目前市场占比来说普遍使用Eclipse和IntelliJ IDEA这两款主…

字节软件测试岗:惨不忍睹的三面,幸好做足了准备,月薪19k,已拿offer

我今年25岁&#xff0c;专业是电子信息工程本科&#xff0c;19年年末的时候去面试&#xff0c;统一投了测试的岗位&#xff0c;软件硬件都有&#xff0c;那时候面试的两家公司都是做培训的&#xff0c;当初没啥钱&#xff0c;他们以面试为谎言再推荐去培训这点让我特别难受。后…

让huggingface/transformers的AutoTokenizer从本地读词表

https://stackoverflow.com/questions/62472238/autotokenizer-from-pretrained-fails-to-load-locally-saved-pretrained-tokenizer

ArcGIS网络分析之构建网络分析数据集(一)

说明: 1. 本文主要用于演示网络分析服务的搭建过程。所以在此不会深入讨论网络分析服务的每一个细节,本文的目的就是让初学者学会使用网络分析服务进行基本的分析(主要针对后续的WEB开发):路径分析,最近设施点分析,以及服务区分析。 2.关于OD成本矩阵分析,多路径配送,…