算法工程师第十九天(理论基础 组合 组合总和III 电话号码的字母组合)

news2024/9/25 7:15:45

参考文献 代码随想录

一、组合

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

你可以按 任何顺序 返回答案。

示例 1:

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

示例 2:

输入:n = 1, k = 1
输出:[[1]]

提示:

  • 1 <= n <= 20
  • 1 <= k <= n

问题分析:回溯主要考虑到参数和处理逻辑

    def __init__(self):
        self.ans = []
        self.stack = []
    def combine(self, n, k):
        """
        :type n: int
        :type k: int
        :rtype: List[List[int]]
        """
        self.backstrking(1, n, k)
        return self.ans
    def backstrking(self,start, n, k):
        if len(self.stack) == k:
            self.ans.append(self.stack[:])
            return
        for i in range(start, n + 1):
            self.stack.append(i)
            self.backstrking(i + 1, n,  k)
            self.stack.pop()

 剪枝

class Solution(object):
    def __init__(self):
        self.ans = []
        self.stack = []
    def combine(self, n, k):
        """
        :type n: int
        :type k: int
        :rtype: List[List[int]]
        """
        self.backstrking(1, n, k)
        return self.ans
    def backstrking(self,start, n, k):
        if len(self.stack) == k:
            self.ans.append(self.stack[:])
            return
        for i in range(start,  n - (k - len(self.stack)) + 2):  # n - (k - len(self.stack)) + 2。(k - len(self.stack)这个试求,还需要多少个元素n - (k - len(self.stack))最多的起始遍历位子(最多遍历到当前这个数,往后遍历,没有满足要求)
            self.stack.append(i)
            self.backstrking(i + 1, n, k)
            self.stack.pop()

二、组合总和 III

找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:

  • 只使用数字1到9
  • 每个数字 最多使用一次 

返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

示例 1:

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

示例 2:

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

示例 3:

输入: k = 4, n = 1
输出: []
解释: 不存在有效的组合。
在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。
class Solution(object):
    def __init__(self):
        self.ans = []
        self.stack = []
    def combinationSum3(self, k, n):
        """
        :type k: int
        :type n: int
        :rtype: List[List[int]]
        """
        self.backstrikng(1, k, n)
        return self.ans
    def backstrikng(self, startIndex, k, n):
        if sum(self.stack) == n and len(self.stack) == k:
            self.ans.append(self.stack[:])
        for i in range(startIndex, 10):
            self.stack.append(i)
            self.backstrikng(i + 1, k , n)
            self.stack.pop()

剪枝

class Solution(object):
    def __init__(self):
        self.ans = []
        self.stack = []
    def combinationSum3(self, k, n):
        """
        :type k: int
        :type n: int
        :rtype: List[List[int]]
        """
        self.backstrikng(1, k, n)
        return self.ans
    def backstrikng(self, startIndex, k, n):
        if sum(self.stack) > n:  # 一旦返现和大于n,那么就结束掉
            return
        if sum(self.stack) == n and len(self.stack) == k:
            self.ans.append(self.stack[:])
        for i in range(startIndex, 9 - (k - len(self.stack)) + 2):  # 为什么要加2,为什么首先是加1,为什么要加一呢?因为当k = 2, self.stack.size == 0,那么后面就只能取到8,然后要加1才能取到这样才能组合1到9的组合问题
            self.stack.append(i)
            self.backstrikng(i + 1, k , n)
            self.stack.pop()

三、电话号码的字母组合

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

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

示例 1:

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

示例 2:

输入:digits = ""
输出:[]

示例 3:

输入:digits = "2"
输出:["a","b","c"]

问题分析:上面2题都是用了startIndex,这个是控制不重复元素,并且是在一个集合里,而本题不一样的是在多个集合求组合问题,然后我们定义一index来记录访问到了那个结合,如果index等于digits的长度,那么说明,已经遍历完全部结合,为什么index 是从0开始呢,因为要遍历digits中的按键,那么结束,为什么要等于长度呢?因为,要遍历完digits,如果不等于它的长度,那么当遍历到最后一个按键是,将退出遍历,那么就不满足题目需要。

class Solution(object):
    def __init__(self):
        self.dic = {
            1:'',
            2:"abc",
            3:"def",
            4:"ghi",
            5:"jkl",
            6:"mno",
            7:"pqrs",
            8:"tuv",
            9:"wxyz"
        }
        self.ans = []
        self.stack = []
    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        if not digits:
            return self.ans
       
        self.backstriking(digits, 0)
        return self.ans
    def backstriking(self, digits, index):
        if index == len(digits):
            self.ans.append("".join(self.stack))
            return
        digit = int(digits[index])  # 获取对应的按键
        strd = self.dic[digit]  # 获取对应的字符串  多个集合组合问题
        for i in range(len(strd)):
            self.stack.append(strd[i])
            self.backstriking(digits, index + 1)
            self.stack.pop()

简化版本

class Solution(object):
    def __init__(self):
        self.dic = {
            1:'',
            2:"abc",
            3:"def",
            4:"ghi",
            5:"jkl",
            6:"mno",
            7:"pqrs",
            8:"tuv",
            9:"wxyz"
        }
        self.ans = []
    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        if not digits:
            return self.ans
        self.backstriking(digits, 0, '')
        return self.ans

    def backstriking(self, digits, index, s):
        if index == len(digits):
            self.ans.append(s)
            return

        digit = int(digits[index])  # 获取对应的按键
        strd = self.dic[digit]  # 获取对应的字符串  2个集合组合问题
        
        for i in range(len(strd)):
            self.backstriking(digits, index + 1, s + strd[i])
    

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

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

相关文章

Windows本地启动Redis

找到本地redis目录 输入cmd,然后输入redis-server.exe redis.windows.conf&#xff0c;默认端口为6379 再新打开一个cmd&#xff0c;输入redis-cli.exe -p 6379 -a &#xff08;你在redis.windows.conf中设置的密码&#xff09;

Kubeflow 模型管理和训练优化的新工具

Kubeflow 显著简化了安全机器学习模型和大语言模型&#xff08;LLMs&#xff09;的开发、调优和管理。亮点包括&#xff1a; 模型注册表&#xff1a;集中管理机器学习模型、版本和制品。 LLMs 微调 API&#xff1a;简化使用自定义数据集微调 LLMs 的过程。 流水线&#xff1a…

如何在 SpringBoot 中优雅的做参数校验?

一、故事背景 关于参数合法性验证的重要性就不多说了&#xff0c;即使前端对参数做了基本验证&#xff0c;后端依然也需要进行验证&#xff0c;以防不合规的数据直接进入服务器&#xff0c;如果不对其进行拦截&#xff0c;严重的甚至会造成系统直接崩溃&#xff01; 本文结合…

7月22日JavaSE学习笔记

Collection接口&#xff0c;还有一个父级接口Iterable可迭代的 Collection继承树 Set 集合 Set的底层是用Map实现&#xff08;存储在key中&#xff0c;value中是空的Object对象&#xff09; 有序&#xff1a;取出的顺序和添加的顺序是一样的。 List是有序的&#xff0c;Set是…

Idea2024 创建Meaven项目没有src文件夹

1、直接创建 新建maven项目&#xff0c;发现没有src/main/java 直接新建文件夹&#xff1a;右击项目名->new->Directory 可以看到idea给出了快捷创建文件夹的选项&#xff0c;可以根据需要创建&#xff0c;这里点击src/main/java 回车&#xff0c;可以看到文件夹已经创建…

搭建本地私有知识问答系统:MaxKB + Ollama + Llama3 (wsl网络代理配置、MaxKB-API访问配置)

目录 搭建本地私有知识问答系统:MaxKB、Ollama 和 Llama3 实现指南引言MaxKB+Ollama+Llama 3 Start buildingMaxKB 简介:1.1、docker部署 MaxKB(方法一)1.1.1、启用wls或是开启Hyper使用 WSL 2 的优势1.1.2、安装docker1.1.3、docker部署 MaxKB (Max Knowledge Base)MaxKB …

解决Windows 11更新错误0x800f081f的详细指南

在尝试更新Windows 11时&#xff0c;用户可能会遇到各种错误代码&#xff0c;其中之一是0x800f081f。这个错误通常与Windows更新组件或系统文件的损坏有关。本文将提供解决这一特定错误的详细步骤&#xff0c;并解释可能的原因。 错误代码0x800f081f概述 错误代码0x800f081f指…

【LLM】-08-搭建问答系统-语言模型,提问范式与 Token

目录 1、语言模型 1.1、训练过程&#xff1a; 1..2、大型语言模型分类&#xff1a; 1.3、指令微调模型训练过程&#xff1a; 2、Tokens 3、Helper function辅助函数 (提问范式) 4、计算token数量 1、语言模型 大语言模型&#xff08;LLM&#xff09;是通过预测下一个词…

【数据结构】搜索二叉树

二叉搜索树 二叉树的博客 在之前的数据结构的文章中已经基本对二叉树有一定的了解&#xff0c;二叉搜索树也是一种数据结构&#xff0c;下面将对二叉搜索树进行讲解。 二叉搜索树的概念 二叉搜索树又称为二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有下面性…

汇凯金业:区块链技术包括哪些技术

区块链&#xff0c;作为一项颠覆性的技术&#xff0c;其应用场景日益广泛。然而&#xff0c;很多人对于区块链技术的组成部分却知之甚少。本文将深入探讨区块链技术所包含的各种技术组件&#xff0c;揭示其背后的工作原理&#xff0c;帮助读者更全面地理解区块链。 区块链技术…

最优化大模型效果之 RAG(一):Naive RAG

Hi&#xff0c;我是 Hyde&#xff0c;今天的话题是 RAG&#xff08;Retrieval-Augmented Generation&#xff09;&#xff0c;一种用于优化大模型效果的方法&#xff0c;翻译成中文就是检索增强生成。 在之前的文章《最优化大模型效果的方向和思考》中&#xff0c;我们提到当前…

Google Test 学习笔记(简称GTest)

文章目录 一、介绍1.1 介绍1.2 教程 二、使用2.1 基本使用2.1.1 安装GTest &#xff08;下载和编译&#xff09;2.1.2 编写测试2.1.3 运行测试2.1.4 高级特性2.1.5 调试和分析 2.2 源码自带测试用例2.3 TEST 使用2.3.1 TestCase的介绍2.3.2 TEST宏demo1demo2 2.3.3 TEST_F宏2.3…

2-45 基于matlab的递归最小二乘法(RLS)对声音信号去噪

基于matlab的递归最小二乘法&#xff08;RLS&#xff09;对声音信号去噪,并对消噪前后的信号进行FFT分析&#xff0c;对比消噪前后的效果。可替换自己的声音信号进行分析。程序已调通&#xff0c;可直接运行。 2-45 递归最小二乘法&#xff08;RLS&#xff09; FFT分析 - 小红书…

聘请TPM管理咨询公司如何赢得员工认可?

聘请TPM管理咨询公司是一个重要的决策&#xff0c;它不仅能提升企业的运营效率和质量管理水平&#xff0c;而且需要得到员工的广泛认可才能确保改革的顺利实施。然而&#xff0c;赢得员工的认可并非易事&#xff0c;需要公司管理层和咨询公司共同努力&#xff0c;采取一系列措施…

崖山异构数据库迁移利器YMP初体验-Oracle迁移YashanDB

前言 首届YashanDB「迁移体验官」开放后&#xff0c;陆续收到「体验官」们的投稿&#xff0c;小崖在此把优秀的投稿文章分享给大家~今天分享的用户文章是《崖山异构数据库迁移利器YMP初体验-Oracle迁移YashanDB》&#xff08;作者&#xff1a;小草&#xff09;&#xff0c;满满…

C++ | Leetcode C++题解之第275题H指数II

题目&#xff1a; 题解&#xff1a; class Solution { public:int hIndex(vector<int>& citations) {int n citations.size();int left 0, right n - 1;while (left < right) {int mid left (right - left) / 2;if (citations[mid] > n - mid) {right m…

C++ primer plus 第16章string 类和标准模板库, 函数符概念

C primer plus 第16章string 类和标准模板库, 函数符概念 C primer plus 第16章string 类和标准模板库, 函数符概念 文章目录 C primer plus 第16章string 类和标准模板库, 函数符概念16.5.1 函数符概念程序清单16.15 functor.cpp 16.5.1 函数符概念 正如 STL定义了容器和迭代…

【AOP实战】掌握Spring Boot AOP:重构代码,提升效率

文章目录 Spring Boot AOP - 面向切面编程AOP到底有什么不同AOP中的编程术语和常用注解定义切面环绕通知通知方法传参总结 Spring Boot AOP - 面向切面编程 AOP&#xff0c;即面向切面编程&#xff0c;其核心思想就是把业务分为核心业务和非核心业务两大部分。例如一个论坛系统…

ESP32和mDNS学习

目录 mDNS的作用mDNS涉及到的标准文件组播地址IPv4 多播地址IPv6 多播地址预先定义好的组播地址 mDNS调试工具例程mDNS如何开发和使用注册服务查询服务 mDNS的作用 mDNS 是一种组播 UDP 服务&#xff0c;用来提供本地网络服务和主机发现。 你要和设备通信&#xff0c;需要记住…

PHP基础语法-Part1

脚本格式 PHP脚本以<?php开头&#xff0c;以?>结尾&#xff1b; PHP语句以分号结尾&#xff08;;&#xff09; PHP是解释型语言&#xff1b; 输入和输出 获取用户的输入&#xff1a; $input readline("input:"); echo $input; echo "input:";…