leetcode77--组合

1. 题意

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

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

2. 题解

1. 回溯+减枝

class Solution {
public:vector<int> temp;vector<vector<int>> ans;void dfs(int cur, int n, int k) {// 剪枝:temp 长度加上区间 [cur, n] 的长度小于 k,不可能构造出长度为 k 的 tempif (temp.size() + (n - cur + 1) < k) {return;}// 记录合法的答案if (temp.size() == k) {ans.push_back(temp);return;}// 考虑选择当前位置temp.push_back(cur);dfs(cur + 1, n, k);temp.pop_back();// 考虑不选择当前位置dfs(cur + 1, n, k);}vector<vector<int>> combine(int n, int k) {dfs(1, n, k);return ans;}
};作者:力扣官方题解
链接:https://leetcode.cn/problems/combinations/solutions/405094/zu-he-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 我的
class Solution {
public:void gen(int begin, int n, int k, vector<vector<int>> &ans, vector<int> &seq) {if ( seq.size() == k) {ans.emplace_back(seq);return ;}for (int i = begin; i <= n; ++i) {seq.emplace_back(i);gen(i + 1, n, k, ans, seq);seq.pop_back();}}vector<vector<int>> combine(int n, int k) {vector<vector<int>> ans;vector<int> seq;gen(1, n,k,ans,seq);return ans;}
};
2. 二进制枚举

困难的点在于

  • 如何根据字典序顺序生成 k k k1 n − k n-k nk0的排列
  • 如何将二进制的生成排列转换为,序列数的排列

对于问题1,假设当前排列值为 v v v,则 n e x t ( v ) next(v) next(v)应为,

  1. v的最低位为1,从低到高找到最后一个连续的1;将它和它左边的0交换。
    n=5,k=3, v=00111 next(v) = 01011
  2. v的最低位为0,先从低到高过滤掉连续的0, 再找到最高位的连续1, 让它和它左边的0交换;最后再将其低位的1移到最低位。如n=5,k=3; v = 10110, next(v)=11001

我们将1 2对比着看,不难发现情况1实际上是情况2的特殊情况,即没有前面的0要去。

我们可以k位的序列p1-n来表示第几位上有数字1, 此时的序列也正好对应我们要寻找的答案。
l e n ( p ) = k , ∀ i < k , 1 ≤ p i ≤ n len(p) =k, \forall i \lt k, 1 \le p_i \le n len(p)=k,i<k,1pin

我们最后做一下转化,连续的1,即对应
p [ i ] + 1 = p [ i + 1 ] p[i] + 1 =p[i+1] p[i]+1=p[i+1]
而在p表示中,最低位的连续0实际上已经自动去掉了。

  • 官解代码
class Solution {
public:vector<int> temp;vector<vector<int>> ans;vector<vector<int>> combine(int n, int k) {// 初始化// 将 temp 中 [0, k - 1] 每个位置 i 设置为 i + 1,即 [0, k - 1] 存 [1, k]// 末尾加一位 n + 1 作为哨兵for (int i = 1; i <= k; ++i) {temp.push_back(i);}temp.push_back(n + 1);int j = 0;while (j < k) {ans.emplace_back(temp.begin(), temp.begin() + k);j = 0;// 寻找第一个 temp[j] + 1 != temp[j + 1] 的位置 t// 我们需要把 [0, t - 1] 区间内的每个位置重置成 [1, t]while (j < k && temp[j] + 1 == temp[j + 1]) {temp[j] = j + 1;++j;}// j 是第一个 temp[j] + 1 != temp[j + 1] 的位置++temp[j];}return ans;}
};作者:力扣官方题解
链接:https://leetcode.cn/problems/combinations/solutions/405094/zu-he-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

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

相关文章

流量分析利器arkime的学习之路(二)---API接口

前文回忆 《流量分析利器arkime的学习之路(一)---安装部署》 概述 注意点 Arkime对所有API调用都使用摘要身份验证,因此请确保在库或curl命令中启用摘要身份验证。学习如何进行API调用的最简单方法是打开浏览器的javascript控制台,观察Arkime UI正在进行的调用,它使用…

向表内INSERT数据出现ORA-00600 ktspgfb-inc2错误的分析处理

业务高峰期&#xff0c;业务维护人员反馈某业务卡主&#xff0c;发来报错一看&#xff0c;是ORA-00600...的&#xff0c;心理一下就紧张起来&#xff1b;当前版本的ORA-00600错误&#xff0c;基本分为了2类&#xff0c;要么没啥影响&#xff1b;如果对业务有影响了&#xff0c;…

强化学习的重要概念:环境、模型、策略和它们的关系

在强化学习中&#xff0c;环境&#xff08;Environment&#xff09;、模型&#xff08;Model&#xff09;和策略&#xff08;Policy&#xff09;是三个核心概念&#xff0c;它们之间的关系可以描述如下&#xff1a; 环境&#xff08;Environment&#xff09;&#xff1a; 环境是…

<component> <slot> <template>三者之间的区别与使用

学习目标&#xff1a; 目标 1、了解组件的含义 2、了解 的含义及用法 3、了解 的含义及用法 4、了解 的含义及用法 学习内容&#xff1a; 内容&#xff1a; 什么是组件&#xff1f; 组件的出现&#xff0c;就是为了拆分Vue实例的代码量&#xff0c;能够让我们以不同的组件&am…

deque的插入和删除

函数原型 两端插入操作 push_back(elem) //向容器尾部添加一个数据push_front(elem) //向容器头部插入一个数据pop_back() //删除容器最后一个数据 pop_front() //删除第一个容器第一个数据 …

点云数据处理的库

PCL、Open3D和OpenGL都是用于点云数据处理的常用库&#xff0c;它们各有优劣&#xff0c;具体如下&#xff1a; PCL&#xff08;Point Cloud Library&#xff09; PCL是一个非常流行的开源点云数据处理库&#xff0c;它支持从各种传感器&#xff08;如激光雷达、Kinect&#xf…

Python实战 | 只需“4步”入门网络爬虫(小白也会)

文章目录 Python实战 | 只需“4步”入门网络爬虫&#xff08;小白也会&#xff09;1&#xff1a;确定目标网站和数据2&#xff1a;安装必要的库3&#xff1a;编写爬虫代码4.目标网站的URL5.发送HTTP请求并获取响应内容6.使用BeautifulSoup解析HTML内容7.查找包含新闻标题和链接…

【golang学习之旅】Go 的基本数据类型

系列文章 【golang学习之旅】报错&#xff1a;a declared but not used 目录 系列文章总览布尔型&#xff08;bool&#xff09;字符串型&#xff08;string&#xff09;整数型&#xff08;int、uint、byte、rune&#xff09;浮点型&#xff08;float32、float64&#xff09;复…

【C++】——类与对象引入和认识

创作不易&#xff0c;多多支持&#xff01; 前言 有了上一篇博客的基础以后&#xff0c;就正式进入C类和对象的领域了&#xff0c;如果看完本篇文章对你有用&#xff0c;还请多多支持&#xff01;&#xff01;&#x1f618;&#x1f618; 一 面向过程和面向对象 1.面向过程 …

js的includes函数

在JavaScript中&#xff0c;includes() 是一个数组&#xff08;Array&#xff09;和字符串&#xff08;String&#xff09;对象的方法&#xff0c;用于确定一个数组是否包含一个特定的值&#xff0c;或者一个字符串是否包含一个特定的子串。如果找到该值或子串&#xff0c;则返…

MySql on duplicate key update

"ON DUPLICATE KEY UPDATE"是MySQL的语法&#xff0c;当尝试插入的行导致一个duplicate key错误&#xff08;如果该行中存在一个unique索引或primary key&#xff0c;并且该索引或primary key在表中已经存在&#xff09;&#xff0c;则执行UPDATE。 使用基本的SQL语…

单链表实现通讯录

不过多赘述了 顺序表的增删查改-CSDN博客https://blog.csdn.net/bkmoo/article/details/137566495?spm1001.2014.3001.5502 使用顺序表实现通讯录-CSDN博客https://blog.csdn.net/bkmoo/article/details/137676561?spm1001.2014.3001.5502这里没有使用文件操作只是简单的使…

全程免费的ssl证书申请——七步实现网站https

全程免费的ssl证书申请步骤如下&#xff1a; 1 准备工作 首先确定好需要的证书类型&#xff0c;如单域名证书、通配符证书和多域名证书&#xff0c;准备好需要安装证书的域名。 2 选择CA 选择提供免费证书的服务商——JoySSL&#xff0c;并访问其官方网站&#xff0c;创建一…

3d软件哪个适合新手学?3D动画渲染怎么好

在不同的行业领域&#xff0c;3D建模和动画的需求各异&#xff0c;因此所需的3D软件工具也会有所不同。对于刚开始接触3D设计的新手来说&#xff0c;软件的易操作性、丰富的学习资源以及与自己专业领域相关的功能是选择时的重要考虑因素。以下是几款适合初学者入门的3D软件推荐…

代码随想录训练营Day 32|Python|Leetcode|● 738.单调递增的数字

738.单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 解题思路&#xff1a; 对于所给数字进行str()并从后向前…

【智能算法应用】灰狼算法(GWO)在低照度图像增强中的应用

目录 1.算法原理2.数学模型3.结果展示4.参考文献 1.算法原理 【智能算法】灰狼算法&#xff08;GWO&#xff09;原理及实现 2.数学模型 对于低照度图像的增强方式可以采用非线性变换函数来对图像的灰度值进行变化&#xff0c;对于不同环境下质量不同的图像&#xff0c;可以将…

YOLOv8+PyQt5输电线路缺陷检测(目前最全面的类别检测,可以从图像、视频和摄像头三种路径检测)

1.效果视频&#xff1a;YOLOv8PyQt5输电线路缺陷检测&#xff08;目前最全面的类别检测&#xff0c;可以从图像、视频和摄像头三种路径检测&#xff09;_哔哩哔哩_bilibili 资源包含可视化的输电线路缺陷检测系统&#xff0c;可识别图片和视频当中出现的五类常见的输电线路缺陷…

python:pyqt5案例(简易浏览器)

1、上接pyqt5基础https://blog.csdn.net/weixin_73011353/article/details/138051734https://blog.csdn.net/weixin_73011353/article/details/138051734 2、基本模块 # 定义一个名为BrowserWindow的类&#xff0c;继承自QMainWindow class BrowserWindow(QMainWindow):def _…

美国电子电器产品FCC认证讲解

美国FCC认证简介 FCC全称是Federal Communications Commission&#xff0c;中文为美国联邦通信委员会。于1934年由CommunicationACT建立&#xff0c;是美国政府的一个独立机构&#xff0c;直接对国会负责。FCC通过控制无线电广播、电视、电信、卫星和电缆来协调和国际的通信。涉…

JS中跳转传参的几种方法

在JavaScript中&#xff0c;页面跳转并传递参数主要有以下几种方法&#xff1a; 1. 使用URL的查询字符串 这是最常见的方法&#xff0c;你可以在URL后面添加查询字符串来传递参数。查询字符串以?开始&#xff0c;参数之间用&分隔。 例如&#xff1a; window.location.…