leetcode 77. 组合

news2025/2/3 2:46:16

2023.7.17

         今天正式开始回溯系列,这是一道经典回溯题。 先上一个经典回溯模板:

void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

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

         本题在模板的基础上,还要加上一个参数start,用于防止在集合中选到同样的元素,如[1,1][2,2]等。 下面细节看代码:

class Solution {
public:
    vector<vector<int>> ans;
    vector<int> path;
    void backtracking(int n, int k, int start)
    {
        if(path.size() == k) 
        {
            ans.push_back(path);
            return;
        }
        for(int i=start; i<=n; i++)
        {
            path.push_back(i);
            backtracking(n,k,i+1);
            path.pop_back();
        }
    }
    vector<vector<int>> combine(int n, int k) 
    {
        backtracking(n,k,1);
        return ans;
    }
};

        剪枝优化:

        考虑一种极端情况:当n和k都取4时,那么当{1,2,3,4}添加到ans之后,从元素2开始遍历就没有意义了,因为需要4个元素,而从2开始遍历最多只有3个元素。 所以语句 for(int i=start; i<=n; i++)可以做一个优化:

  • 我们需要的元素个数为:k-path.size()   
  • 集合剩余元素为:n-i+1 (包括初始元素i,所以要+1)
  • 我们需要的元素应该小于等于集合剩余元素:k-path.size()   <=  n-i+1,反解得到:                    i <= n-k+path.size()+1

优化后的代码为:

class Solution {
public:
    vector<vector<int>> ans;
    vector<int> path;
    void backtracking(int n, int k, int start)
    {
        //中止条件
        if(path.size() == k) 
        {
            ans.push_back(path);
            return;
        }
        //for(int i=start; i<=n; i++)
        for(int i=start; i<=n-k+path.size()+1; i++)
        {
            path.push_back(i);
            backtracking(n,k,i+1);
            path.pop_back();
        }
    }
    vector<vector<int>> combine(int n, int k) 
    {
        backtracking(n,k,1);
        return ans;
    }
};

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

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

相关文章

飞行动力学 - 第10节-空间机动性、稳定性与操纵性概述 之 基础点摘要

飞行动力学 - 第10节-空间机动性、稳定性与操纵性概述 之 基础点摘要 1. 协调盘旋性能计算流程2. 一般盘旋2.1 动力学方程2.2 角点速度2.3 典型战斗机盘旋曲线 3. 空间机动能力4. 飞行动力学&#xff1a;飞行性能稳定性与操纵性5. 稳定性定义6. 飞行品质6.1 品质等级6.2 品质评…

大数据测试之数据仓测试怎么做(上)

前面的文章我们为大家介绍了大数据测试平台和大数据系统的测试方法&#xff0c;接下来我们重点来讲一下数据仓库测试&#xff0c;首先看一下它的定义。 数据仓库(Data Warehouse)&#xff1a;一个面向主题的&#xff08;Subject Oriented&#xff09;、集成的 &#xff08;In…

给学弟妹们的 10 个秋招建议!

大家好&#xff0c;我是鱼皮。最近很多大公司的提前批陆陆续续开启了&#xff0c;说明秋招已经拉开了序幕&#xff0c;大家要准备起来了。 所以我也赶紧写了一篇文章&#xff0c;结合自己曾经大厂求职的经验&#xff0c;并且从招聘方的角度&#xff0c;给学弟妹们一些秋招找工…

机器人架构设计和中间件

一&#xff0e;引言 在无人驾驶与机器人领域&#xff0c;算法一直都是研究的核心。无论是导航技术、控制技术&#xff0c;还是识别技术都是构成其技术栈的重要组成部分。但是&#xff0c;随着技术的发展&#xff0c;开发者们逐渐认识到一个问题&#xff0c;即程序本身的组织架构…

善用AI; AI生成美女图片中隐藏汉字,光影艺术引爆网络讨论

&#x1f989; AI新闻 &#x1f680; AI生成美女图片中隐藏汉字&#xff0c;光影艺术引爆网络讨论 摘要&#xff1a;近期&#xff0c;一组AI生成的美女图片在网络上疯传&#xff0c;用户发现这些图片中隐藏了汉字。这种光影艺术效果引起了广泛关注和讨论。AI绘画工具ControlN…

红外雨量计(光学雨量传感器)在小型气象站的应用

红外雨量计&#xff08;光学雨量传感器&#xff09;在小型气象站的应用 红外雨量计是一种常见的气象测量设备&#xff0c;也是小型气象站中一个重要的组成部分。随着现代科技的发展&#xff0c;红外雨量计逐渐取代了传统的测雨器&#xff0c;成为广大气象从业人员的首选设备。…

新建Proteus工程文件以及51单片机的最小系统的绘制和简单介绍

一、新建Proteus工程 1.创建一个新的文件夹存放工程 2.打开Proteus 8软件&#xff0c;界面如图所示 3.点击【新建工程】 4.填写工程名称&#xff0c;选择工程保存路径&#xff08;步骤1中创建的新文件夹&#xff09;后点击【Next】 5.选择【从选中的模板中创建原理图】,选择具体…

startqueue(模拟实现及底层原理)

目录 容器适配器 STL标准库中stack和queue的底层结构 ​deque deque的原理 deque的缺陷 为什么选择deque作为stack和queue的底层默认容器 stack stack的介绍 stack的函数 stack的模拟实现 queue queue的介绍 queue的函数 queue的模拟实现 priority_queue prior…

opencv基础09-图像运算之-加法运算(图像增强预处理)

opencv基础09-图像运算 什么是图像运算&#xff1f; 在图像处理过程中&#xff0c;经常需要对图像进行加法运算。可以通过加号运算符“”对图像进行加法运算&#xff0c;也可以通过 cv2.add()函数对图像进行加法运算。 通常情况下&#xff0c;在灰度图像中&#xff0c;像素用…

美颜滤镜SDK:打造个性化直播体验的关键工具

时下&#xff0c;美颜滤镜SDK则成为了打造个性化直播体验的关键工具。美颜滤镜SDK&#xff0c;顾名思义&#xff0c;就是一种可以为直播画面添加美颜效果的软件开发工具包。通过该SDK&#xff0c;用户可以在直播过程中使用各种美颜滤镜&#xff0c;让自己的肌肤更加细腻、光滑&…

云原生之深入解析K8S中Ceph的部署与功能测试

一、前言 Ceph 在 k8s 中用做共享存储还是非常方便的&#xff0c;Ceph 是比较老牌的分布式存储系统&#xff0c;非常成熟并且功能也强大&#xff0c;支持三种模式&#xff08;快存储、文件系统存储、对象存储&#xff09;&#xff0c;那么如何在 k8s 使用 ceph 呢&#xff1f;…

横向滚动日期显示对应周几

common.js: //获取当前时间&#xff0c;格式YYYY-MM-DD HH:MM:SS const GetNowTime time > {var date time,year date.getFullYear(),month date.getMonth() 1,day date.getDate(),hour date.getHours() < 10 ? "0" date.getHours() : date.getHours…

前端学习——ajax (Day1)

AJAX 概念和 axios 使用 axios 使用 练习 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" …

docker-compose安装redis高可用哨兵集群(一主二从三哨兵)

以redis 7.0为例子 直接上代码 docker-compose.yaml version: 3.3 services:master:image: redis:7.0container_name: redis-master#restart: alwayscommand: redis-server --port 6379 --requirepass root --appendonly yes --masterauth root --replica-announce-ip 192.1…

什么是 TCP 和 UDP?Java 中如何实现 TCP 和 UDP 协议

在计算机网络中&#xff0c;TCP&#xff08;传输控制协议&#xff09;和UDP&#xff08;用户数据报协议&#xff09;是两种最常用的传输层协议。它们都用于在网络上传输数据&#xff0c;但是它们之间有很多不同之处。本文将介绍TCP和UDP的基本概念&#xff0c;以及在Java中如何…

一、基础-4、MySQL启动和客户端连接

一、启动 方法一&#xff1a; 1、winR&#xff0c;输入services.msc&#xff0c;按回车 2、找到MySQL&#xff0c;右键-启动/停止 MySQL安装后&#xff0c;默认已启动。 方法二、 1、winR&#xff0c;输入cmd&#xff0c;打开命令行 2、输入启动与停止命令 二、客户端连接 …

港联证券-“肉签”频出!这周打新看TA们→

近期&#xff0c;新股市场有所回暖&#xff0c;“赚钱效应”随之提高。Choice数据显现&#xff0c;上星期8只新股的上市首日均匀涨幅为56%&#xff0c;呈逐周上涨态势。其中&#xff0c;赛维年代首日大涨115.11%&#xff0c;中一签约可赚1.2万元&#xff1b;昊帆生物、英华特、…

ShardingSphere项目实战集群环境准备

&#x1f680; ShardingSphere &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&…

React06-简单实战案例

一、计时器 1. 案例场景 计时器在很多网站中都有使用&#xff0c;以时分秒的格式展示当前时间&#xff0c;每秒刷新一次。 2. 案例展示 展示的时间将随着系统时间&#xff0c;每秒刷新一次。 3. 案例代码 import { useState, useEffect } from react;export default func…

golang中的【数组】相关知识点

目录 数组含义数组定义形式数组的声明初始化方式数组变量的类型 arr的特征数组的遍历遍历的用法二数组的值传递数组的引用&取地址 传送二维数组的相关操作定义二维数组初始化遍历 Golang是一种高效的编程语言&#xff0c;具有很多特性和优点&#xff0c;其中之一就是其对数…