力扣:77. 组合(回溯, path[:]的作用)

news2024/9/20 22:37:47

题目:

给定两个整数 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

思路(path[:]的作用):

本题是回溯法的经典题目。

可以直接套用模板(需要理解具体题目含义,此处就不做详细分析),模板如下:

def backtracking(self, 参数):
    if (终止条件):
        存放结果
        return
    

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)
        处理节点
        self.backtracking(路径,选择列表)  # 递归
        回溯,撤销处理结果

这里需要注意下本题中 result.append(path[:])  (见下图完整代码), 为什么不是result.append(path)呢? 

在这里,path[:]的作用是创建path列表的副本。当我们使用path[:]时,实际上是对path列表进行了浅拷贝,得到了一个新的列表,该列表与path具有相同的元素。这样做的目的是为了避免直接操作原始的path列表,因为在回溯算法中,我们会频繁地对path进行添加和删除操作,如果直接操作原始的path列表,会导致结果不准确。通过使用path[:]创建副本,我们可以在不影响原始path列表的情况下,将其添加到result列表中,确保每个结果都是正确的。

剪枝优化:

回溯法虽然是暴力搜索,但也有时候可以有点剪枝优化一下的。

来举一个例子,n = 4,k = 4的话,那么第一层for循环的时候,从元素2开始的遍历都没有意义了。 在第二层for循环,从元素3开始的遍历都没有意义了。

图中每一个节点(图中为矩形),就代表本层的一个for循环,那么每一层的for循环从第二个数开始遍历的话,都没有意义,都是无效遍历。

所以,可以剪枝的地方就在递归中每一层的for循环所选择的起始位置

如果for循环选择的起始位置之后的元素个数 已经不足 我们需要的元素个数了,那么就没有必要搜索了

优化前代码: 

 for i in range(startIndex, n + 1): 

 优化过程如下

  1. 已经选择的元素个数:len(path)

  2. 还需要的元素个数为: k - len(path)

  3. 在集合n中至多要从该起始位置 : n - (k - len(path)) + 2,开始遍历

为什么是+2呢,因为左闭右开,i最多为n - (k - len(path)) + 1 

举个例子,n = 4,k = 3, 目前已经选取的元素为0(len(path)为0),n - (k - 0) + 1 即 4 - ( 3 - 0) + 1 = 2。

从2开始搜索都是合理的,可以是组合[2, 3, 4]。

 

优化后代码:

 for i in range(startIndex, n - (k - len(path)) + 2): 

 

代码:

未剪枝:

from typing import List

class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        result = []  # 用于存储最终结果的列表
        self.backtracking(n, k, 1, [], result)  # 调用回溯函数
        return result  # 返回最终结果列表

    # 回溯函数
    def backtracking(self, n, k, startIndex, path, result):
        if len(path) == k:  # 如果当前组合的长度达到要求的k
            result.append(path[:])  # 将当前组合加入最终结果列表
            return result  # 返回最终结果列表
        for i in range(startIndex, n + 1):  # 遍历所有可能的元素 未剪枝 可以进行优化
            path.append(i)  # 将当前元素加入组合
            self.backtracking(n, k, i + 1, path, result)  # 递归调用回溯函数,startIndex更新为i+1
            path.pop()  # 回溯,将当前元素从组合中移除

剪枝优化:

class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        result = []
        self.backtracking(n, k, 1, [], result)
        return result

    
    def backtracking(self, n, k, startIndex, path, result):
        if len(path) == k:
            result.append(path[:])
            return result
        for i in range(startIndex, n - (k - len(path)) + 2): # 优化地方
            path.append(i)
            self.backtracking(n, k, i + 1, path, result)
            path.pop()

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

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

相关文章

MS5541/MS5542,高精度DAC,2.7V 到 5.5V、串行输入、电压输出、16 位数模转换器,可替代AD5541

MS5541/MS5542 是一款单通道、 16 位、串行输入、电压 输出的数模转换器&#xff0c;采用 2.7V 至 5.5V 单电源供电&#xff0c;输出范围 为 0V 至 V REF 。在输出范围内保证单调性&#xff0c;在温度范围为 -40 C 至 85 C 能够提供 1LSB INL 的 14 位精度。…

pycharm git 版本回退

参考 https://blog.csdn.net/qq_38175912/article/details/102860195 yoyoketang 悠悠课堂

PLC物联网,实现工厂设备数据采集

随着工业4.0时代的到来&#xff0c;物联网技术在工厂设备管理领域的应用日益普及。作为物联网技术的重要一环&#xff0c;PLC物联网为工厂设备数据采集带来了前所未有的便捷和高效。本文将围绕“PLC物联网&#xff0c;实现工厂设备数据采集”这一主题&#xff0c;探讨PLC物联网…

合并一个excel文件中的多个sheet

import pandas as pd #要合并的文件路径 filepath/Users/kangyongqing/Documents/kangyq/202311/班均及合班储备/最后校验/二批次组班/ file1z小班合班方案_2012&#xff08;1&#xff09;.xlsx #获取文件d的所有sheet名 df1pd.read_excel(filepathfile1,sheet_nameNone,engine…

Graylog配置日志保留策略

找了半天没找到说的清楚的&#xff0c;只能抠官方文档 graylog的归档&#xff08;日志持久化&#xff09;只有付费版才能用&#xff0c;所以日志只能存在es中 1.理解官方给出的几个概念 轮转策略 (Index Rotation Strategy): 轮转策略定义了何时创建新的索引以及何时关闭旧的索…

C语言-> 文件操作(函数满屏)

系列文章目录 前言 ✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青_C语言,数据结构,函数-CSDN博客 目的&#xff1a;学习文件操作&#xff0c;即…

gitee的学习

1.git下载 下载地址&#xff1a;https://git-scm.com/ 2.建立远程仓库 访问&#xff1a;gitee.com 在此网站上创建 3.本地操作 在本地找一个任意文件&#xff0c;克隆git 执行命令&#xff1a;git clone https://gitee.com/beijing-jiaxin-times_0/test_zsx_cang_ku.git …

变分自动编码器【03/3】:使用 Docker 和 Bash 脚本进行超参数调整

一、说明 在深入研究第 1 部分中的介绍和实现&#xff0c;并在第 2 部分中探索训练过程之后&#xff0c;我们现在将重点转向在第 3 部分中通过超参数调整来优化模型的性能。要访问本系列的完整代码&#xff0c;请访问我们的 GitHub 存储库在GitHub - asokraju/ImageAutoEncoder…

[c]用指针进行四个数排序

#include<stdio.h> void swap(int*p1,int*p2)//定义函数&#xff0c;实现两个数值交换 {int temp;temp*p1;*p1*p2;*p2temp; } void psort( int *pa, int *pb,int *pc,int *pd) {int i1;for(i1;i<3;i)//对四个数排序&#xff0c;至少3次循环&#xff0c;交换过后是升序…

海康威视IP网络对讲广播系统命令执行漏洞(CVE-2023-6895)

漏洞介绍 海康威视IP网络对讲广播系统采用领先的IPAudio™技术,将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输系统。 Hikvision Intercom Broadcasting System 3.0.3_20201113_RELEASE(HIK)版本存在操作系统命令注入漏洞&#xff0c;该漏洞源于文件/ph…

跨境电商独立站有哪些优势,要如何做?

跨境电商独立站是指面向海外市场的电商网站&#xff0c;具有以下优势&#xff1a; 自主品牌 搭建跨境电商独立站可以通过自主品牌的打造&#xff0c;提升品牌的知名度和影响力&#xff0c;同时也可以在海外市场建立起更加稳定的品牌形象。 自主掌控 跨境电商独立站可以自主掌…

Python算法例19 创建最大数

1. 问题描述 给定两个长度分别是m和n的数组&#xff0c;数组的每个元素都是数字0~9&#xff0c;从这两个数组当中选出k个数字来创建一个最大数&#xff0c;其中k满足k&#xff1c;mn&#xff0c;选出来的数字在创建最大数里的位置必须与在原数组内的相对位置一致。返回k个元素…

Java第一个程序——Hello,World!

“Hello, world”的由来可以追溯到 The C Programming Language 。在这门编程语言中&#xff0c;它被用作第一个演示程序&#xff0c;向人们展示了在计算机屏幕上输出“Hello world”这行字符串的计算机程序。由于这个演示程序的简洁性和直观性&#xff0c;它成为了许多初学者学…

韩语中的一次多用-柯桥基础韩语学习

1.动词&#xff0c;写 일기를 쓰다 写日记 2.动词&#xff0c;戴&#xff08;帽子&#xff0c;眼镜&#xff0c;口罩&#xff09; 안경을 쓰다 戴眼镜 3.动词&#xff0c;使用&#xff08;材料&#xff0c;道具&#xff0c;手段&#xff09; 세제를 쓰다 使用洗剂 4.动词&am…

Java对接腾讯多人音视频房间回调接口示例

在前面我们已经对接好了腾讯多人音视频房间相关内容&#xff1a;Java对接腾讯多人音视频房间示例 为了完善业务逻辑&#xff0c;我们还需要对接它的一些回调接口 官方文档地址 主要就下面这些 这里因为比较简单直接上代码 里面有些工具类和上一章一样这里就没贴&#xff0c;需要…

机器学习 | 集成学习

团结就是力量&#xff01; Ensemble Learning 兼听则明&#xff0c;偏信则暗。 集成学习既是一种思想也是一类算法&#xff0c;它是建立在其他机器学习的算法之上&#xff0c;研究怎么让不同的算法之间进行协同。 既可以监督学习&#xff0c;也可以无监督学习。 集成学习用机器…

Gemini 1.0:Google推出的全新AI模型,改变生成式人工智能领域的游戏规则!

Gemini 1.0&#xff1a;Google推出的全新AI模型&#xff0c;将改变生成式人工智能领域的游戏规则&#xff01; &#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; IT杂谈 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 …

C/C++与MySQL:多线程、大并发和异步操作的实践

C/C与MySQL&#xff1a;多线程、大并发和异步操作的实践 在前面的文章中&#xff0c;我们介绍了如何使用C/C调用MYSQL API进行基本的数据库操作。然而&#xff0c;在实际应用中&#xff0c;特别是面对大量用户请求和高并发场景时&#xff0c;单线程的数据库操作往往显得力不从…

降本不增“笑”的正确打开方式

引言: 在当前行业形势下&#xff0c;降本增效已经是公认的命题&#xff0c;粗放扩张的时代已经过去&#xff0c;接下来是在从业务到技术都需要精细化管理的时代。但在这个命题下&#xff0c;往往未被提及的一点是用户价值。如果为了降本增效&#xff0c;而牺牲了用户价值&…

GeoTrust SSL证书详细介绍

GeoTrust是著名的证书颁发CA机构DigiCert的品牌。GeoTrustSSL产品在Internet上提供从基本域名验证到扩展验证SSL标准支持的最高级验证的安全性。 GeoTrust OV&#xff08;组织验证&#xff09;证书验证域所有权和组织的存在。在颁发证书之前&#xff0c;会检查该组织在公共数据…