[力扣题解]77.组合问题

题目:77. 组合

思路

回溯法

调试用代码

// 调试用
// 理解不了减枝那个值怎么设置的
class Solution {
private:
    int order = 0;
    vector<vector<int>> result; // 存放符合条件结果的集合
    vector<int> path; // 用来存放符合条件结果
    void backtracking(int n, int k, int startIndex) {
        if (path.size() == k) 
        {
            result.push_back(path);
            return;
        }
        
        for (int i = startIndex; i <= n - (k - path.size()) + 1; i++) {
            order++;
            cout << order << ". ";
            cout << "val : " << i;
            cout << ", blabla : " << n - (k - path.size()) + 1 << endl;
            path.push_back(i); // 处理节点
            backtracking(n, k, i + 1); // 递归
            path.pop_back(); // 回溯,撤销处理的节点
        }
    }
public:
    vector<vector<int>> combine(int n, int k) {
        result.clear(); // 可以不写
        path.clear();   // 可以不写
        backtracking(n, k, 1);
        return result;
    }
};

Method 1, 剪枝 from 代码随想录

for循环那里,改成i <= n - (k - path.size()) + 1
(不好理解,人家作者也说了不好理解)

Method 2, 剪枝,自己想的

// 自己写的剪枝
class Solution {
private:
    vector<vector<int>> result; // 存放符合条件结果的集合
    vector<int> path; // 用来存放符合条件结果
    void backtracking(int n, int k, int startIndex) {
        if (path.size() == k) 
        {
            result.push_back(path);
            return;
        }
        
        for (int i = startIndex; i <= n; i++) {
            if((k - path.size()) > (n - i + 1)) // 不够了
            {
                continue;
            }
            path.push_back(i); // 处理节点
            backtracking(n, k, i + 1); // 递归
            path.pop_back(); // 回溯,撤销处理的节点
        }
    }
public:
    vector<vector<int>> combine(int n, int k) {
        result.clear(); // 可以不写
        path.clear();   // 可以不写
        backtracking(n, k, 1);
        return result;
    }
};

增加了这部分,剩下的这部分数字(包括当前i)比还需要找的数字数量(总共要找k个数,已经找到了path.size()个数字)少:

if((k - path.size()) > (n - i + 1)) // 不够了
{
	break;
}

比较符合我的思维,但是从效率的角度来讲可能不是最好的;(不过多一条if语句也慢不到哪里去)
实际上经过恒等变换,是和Method 1是一样的,不过一开始就看到for循环里,改变了遍历区间的右端确实可能转不过弯来;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Netty一文搞懂入门篇<随手笔记>

1.Java IO的读写原理 IO是Input和Output的缩写&#xff0c;即输入和输出。用户程序进行IO的读写基本上会用到read和write两大系统调用。 read把数据从内核缓冲区复制到进程缓冲区&#xff0c;write是把数据从进程缓冲区复制到内核缓冲区。 这两大系统的调用都不负责数据在内核…

Jira Server 不维护了,如何将 Jira 平滑迁移到阿里云云效

作者&#xff1a;天彤 Atlassian 在 2020 年官方发布公告&#xff0c;从 2021 年起停止 Jira Server 产品的销售&#xff0c;并且在 2024 年彻底停止 Server 端产品的服务支持&#xff0c;这对于国内使用 Jira 产品的企业和研发团队造成了不小的影响。而此时国内很多 DevOps 产…

LeetCode面试298,二叉树最长连续序列(Python)

开始想着dfs&#xff0c;两种情况 1.以root为根 2.不以root为根 但是这样需要两个dfs分别进行&#xff0c;那么时间复杂度就上去了。 class Solution:def longestConsecutive(self, root: Optional[TreeNode]) -> int:def dfs(root):# 以root为根节点&#xff0c;可以延…

【系统分析师】系统分析部分

文章目录 1、系统分析概述2、详细调查2.1 为什么要做详细调查&#xff1f;2.2 详细调查的原则2.3 详细调查的内容2.4 详细调查的方法 3、现有系统分析3.1 获得系统的物理模型3.2 抽象出现有系统的逻辑模型3.3 建立新系统的逻辑模型3.4 建立新系统的物理模型 4、组织结构分析4.1…

文件夹批量重命名,轻松实现简体中文翻译成繁体中文,文件夹批量改名新体验

文件夹的管理和命名显得尤为重要。你是否曾为了给文件夹取一个合适的名字而 绞尽脑汁&#xff1f;是否因为需要批量修改文件夹名而苦恼不已&#xff1f;现在&#xff0c;我们为你带来一款强大的文件夹批量改名工具&#xff0c;不仅能轻松实现简体中文到繁体中文的转换&#xf…

5月7日监控二叉树+斐波那契数

968.监控二叉树 给定一个二叉树&#xff0c;我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 示例 1&#xff1a; 输入&#xff1a;[0,0,null,0,0] 输出&#xff1a;1 解释&#xff…

LeCun转发,AI让失语者重新说话!纽约大学发布全新「神经-语音」解码器 | 最新快讯

新智元报道 编辑&#xff1a;LRT 通过采集皮层电图&#xff08;ECoG&#xff09;的数据信号&#xff0c;模型可以将其转换为可解释的语音参数&#xff08;如音高&#xff0c;响度&#xff0c;共振峰频率等&#xff09;&#xff0c;并合成出既准确又自然的语音波形。 脑机接口&a…

【C++ | 函数】默认参数、哑元参数、函数重载、内联函数

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-05-04 1…

【Flutter】App内购支付集成 Google和Apple支付和服务器验证全流程

Flutter支付集成 前言&#xff1a; 以谷歌内购为例&#xff0c;我们需要做的总共为三步 需要在谷歌市场配置商品&#xff0c;设置测试渠道&#xff0c;配置开发者账号&#xff0c;设置对应权限。配置完商品之后&#xff0c;如何在 Flutter 中获取到商品&#xff0c;购买指定…

如何为数据库中新建用户B复制用户A的表和视图权限?

故事背景&#xff1a; 公司使用的是SQL Server数据库&#xff0c;经常会碰到一种情况&#xff0c;需要为新入职的员工赋予同组内其他同事的权限。 常用方法: 1) 为同一组申请创建统一的Security Group(安全组)&#xff0c;为创建的组分配相关表和视图的访问权限。不管员工入职…

基于POSIX标准库的读者-写者问题的简单实现

文章目录 实验要求分析保证读写、写写互斥保证多个读者同时进行读操作 读者优先实例代码分析 写者优先示例代码分析 实验要求 创建一个控制台进程&#xff0c;此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件的要求进行读写操作。用信号量机制…

FileLink跨网文件交换,推动企业高效协作|半导体行业解决方案

随着信息技术的迅猛发展&#xff0c;全球信息产业已经迎来了前所未有的繁荣与变革。在这场科技革命中&#xff0c;半导体作为信息产业的基础与核心&#xff0c;其重要性日益凸显&#xff0c;半导体的应用场景和市场需求将进一步扩大。 然而&#xff0c;在这一繁荣的背后&#x…

解决 SyntaxError: Unexpected token ‘.‘ 报错问题

这个报错一般是编译问题&#xff0c;浏览器的版本过低没通过代码 解决办法&#xff1a; 在package.json文件中加上这个 "browserslist": ["> 1%","last 2 versions","not dead","not ie < 6","Android > 4&…

源代码防泄露可以通过哪些方法实现?七种有效方法分享

在当今数字化时代&#xff0c;访问安全和数据安全成为企业面临的重要挑战。传统的边界防御已经无法满足日益复杂的内网办公环境&#xff0c;层出不穷的攻击手段已经让市场单一的防御手段黔驴技穷。当企业面临越来越复杂的网络威胁和数据泄密风险时&#xff0c;更需要一种综合的…

stable-diffusion-webui配置

源码地址 https://github.com/AUTOMATIC1111/stable-diffusion-webui.git报错Fresh install fail to load AttributeError: NoneType object has no attribute _id pydantic降级 pip uninstall pydantic pip install pydantic1.10.11记得要把clip-vit-large-patch14放在opena…

Java集合 总结篇(全)

Java集合 集合底层框架总结 List 代表的有序&#xff0c;可重复的集合。 ArrayList -- 数组 -- 把他想象成C中的Vector就可以&#xff0c;当数组空间不够的时候&#xff0c;会自动扩容。 -- 线程不安全 LinkedList -- 双向链表 -- 可以将他理解成一个链表&#xff0c;不支持…

C语言猜数字游戏

用C语言实现猜数字游戏&#xff0c;电脑随机给出一个范围内的数字&#xff0c;用户在终端输入数字&#xff0c;去猜大小&#xff1b;对比数字&#xff0c;电脑给出提示偏大还是偏小&#xff1b;不断循环&#xff0c;直到正确 #include <stdio.h> #include <time.h>…

【系统架构师】-选择题(十一)

1、紧耦合多机系统一般通过&#xff08;共享内存&#xff09;实现多机间的通信。对称多处理器结构&#xff08;SMP&#xff09;属于&#xff08; 紧耦合&#xff09;系统。 松耦合多机系统又称间接耦合系统,—般是通过通道或通信线路实现计算机间的互连。 2、采用微内核的OS结构…

从互联网医院源码到搭建:开发视频问诊小程序的技术解析

如今&#xff0c;视频问诊小程序作为医疗服务的一种新形式&#xff0c;正逐渐受到人们的关注和青睐。今天&#xff0c;小编将为您详解视频问诊小程序的开发流程。 一、背景介绍 互联网医院源码是视频问诊小程序开发的基础&#xff0c;它提供了一套完整的医疗服务系统框架&…

【vue-echarts】 报错问题解决 “Error: Component series.pie not exists. Load it first.“

目录 问题描述解决【解决1】【解决2】 问题描述 使用 vue-echarts 时导入的文件 import VChart from vue-echarts/components/ECharts import echarts/lib/chart/line import echarts/lib/chart/bar import echarts/lib/chart/pie import echarts/lib/component/legend impor…
最新文章