代码随想录刷题题Day20

刷题的第二十天,希望自己能够不断坚持下去,迎来蜕变。😀😀😀
刷题语言:C++
Day20 任务
● 理论基础
● 77. 组合

1 回溯算法理论基础

在这里插入图片描述

1.1 回溯法

回溯法是一种搜索的方式,是递归的副产品(只要有递归,就会有回溯)
回溯函数就是递归函数

1.2 回溯法的效率

回溯的本质是穷举,穷举所有可能,选出想要的答案。想让回溯法高效一些,可以加一些剪枝的操作但也改不了回溯法就是穷举的本质

1.3 回溯法能解决的问题

(1)组合:N个数里面按一定规则找出k个数的集合
(2)切割:一个字符串按一定规则有几种切割方式
(3)子集:一个N个数的集合里有多少符合条件的子集
(4)排列:N个数按一定规则全排列,有几种排列方式
(5)棋盘:N皇后,解数独
组合是不强调元素顺序的,排列是强调元素顺序。

理解回溯法
回溯法解决的问题都可以抽象为树形结构,因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度,都构成的树的深度,因为递归有终止条件,所以必然是一棵高度有限的N叉树
在这里插入图片描述

1.4 回溯法模板
void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果;}
}

2 组合

77. 组合
在这里插入图片描述
思路:
回溯法解决这种k层for循环嵌套的问题
把回溯法的搜索过程抽象为树形结构
在这里插入图片描述

每次从集合中选取元素,可选择的范围随着选择的进行而收缩,调整可选择的范围。
图中可以发现n相当于树的宽度,k相当于树的深度

回溯法
(1)递归函数的返回值以及参数
定义两个全局变量:存放符合条件的单一结果、存放符合条件结果的集合

vector<vector<int>> result; // 存放符合条件结果的集合
vector<int> path;           // 用来存放符合条件结果

返回值:void
参数:n,k,startIndex

startIndex 就是防止出现重复的组合

在这里插入图片描述
在集合[1,2,3,4]取1之后,下一层递归,在[2,3,4]中取数了,靠的就是startIndex:记录下一层递归,搜索的起始位置

void backtracking(int n, int k, int startIndex)

(2)回溯函数终止条件
到叶子节点,就是path数组大小为k,说明找到了一个子集大小为k的组合。此时用result二维数组,把path保存起来,并终止本层递归

if (path.size() == k) {result.push_back(path);return;
}

(3)单层搜索的过程
回溯法的搜索过程就是一个树型结构的遍历过程
在这里插入图片描述

for (int i = startIndex; i <= n; i++) {// 树的横向遍历path.push_back(i);// 处理节点backtracking(n, k, i + 1);// 递归:控制树的纵向遍历,注意下一层搜索要从i+1开始path.pop_back();// 回溯,撤销处理的节点
}

C++:

class Solution {
public: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++) {path.push_back(i);// 处理节点backtracking(n, k, i + 1);// 递归path.pop_back();// 回溯,撤销处理的节点}}vector<vector<int>> combine(int n, int k) {result.clear();path.clear();backtracking(n, k, 1);return result;}
};

时间复杂度: O ( n ∗ 2 n ) O(n * 2^n) O(n2n)
空间复杂度: O ( n ) O(n) O(n)
组合问题是回溯法解决的经典问题

3 剪枝优化

n = 4,k = 4,第一层for循环的时候,从元素2开始的遍历都没有意义了。
在这里插入图片描述
图中每一个节点代表本层的一个for循环,每一层的for循环从第二个数开始遍历的话,都没有意义,都是无效遍历
以剪枝的地方就在递归中每一层的for循环所选择的起始位置
优化:
(1)已经选择的元素个数:path.size()
(2)还需要的元素个数:k - path.size()
(3)在集合n中至多从该起始位置:n - (k -path.size()) + 1,开始遍历
有个+1是因为包括起始位置,我们要是一个左闭的集合

for (int i = startIndex; i <= n - (k - path.size()) + 1; i++)// i为本次搜索的起始位置

C++:
优化后的代码

class Solution {
public: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++) {path.push_back(i);backtracking(n, k, i + 1);path.pop_back();}}vector<vector<int>> combine(int n, int k) {result.clear();path.clear();backtracking(n, k, 1);return result;}
};

鼓励坚持二十一天的自己😀😀😀

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

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

相关文章

海外媒体发稿:雅虎全球发稿推广脱颖而出的10种方法-华媒舍

雅虎全球发稿是一项重要的推广手段&#xff0c;能够帮助企业和个人提升品牌知名度和曝光率。在众多的发稿中脱颖而出并不容易。本文将为您介绍10种让您的雅虎全球发稿在众多文章中脱颖而出的方法&#xff0c;帮助您取得更好的效果。 1. 深入研究目标受众 在撰写雅虎全球发稿前…

Python to_numeric函数参数解读与最佳实践!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Python中的to_numeric函数是pandas库提供的一个强大而灵活的工具&#xff0c;用于将数据转换为数字类型。本文将深入探讨to_numeric函数的各种参数和用法&#xff0c;通过丰富的示例代码帮助大家更全面地理解和运…

基于thinkphp+vue的大学生校园生活服务平台sb00r

大学生一体化服务平台可以提高大学生综合服务信息管理问题的解决效率&#xff0c;优化大学生综合服务信息处理流程&#xff0c;保证大学生综合服务信息数据的安全&#xff0c;它是一个非常可靠&#xff0c;非常安全的应用程序。 运行环境:phpstudy/wamp/xammp等 开发语言&#…

CAS机制

Java中提供了很多原子操作类来保证共享变量操作的原子性。这些原子操作的底层原理都是使用了CAS机制。在使用一门技术之前&#xff0c;了解这个技术的底层原理是非常重要的&#xff0c;所以本篇文章就先来讲讲什么是CAS机制&#xff0c;CAS机制存在的一些问题以及在Java中怎么使…

鸿蒙应用开发初体验 HelloWorld

9 月 25 日&#xff0c;华为常务董事、终端 BG CEO、智能汽车解决方案 BU 董事长余承东华为秋季全场景新品发布会上介绍了鸿蒙系统的最新进展&#xff1a;HarmonyOS 4 发布后&#xff0c;短短一个多月升级用户已经超过 6000 万&#xff0c;成为史上升级速度最快的 HarmonyOS 版…

WebGL开发三维解剖学应用

开发基于 WebGL 的三维解剖学应用通常涉及以下步骤。这些步骤包括创建三维模型、整合交互性、优化性能等&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.三维模型创建&#xff1a; 首先&#xff0…

智能优化算法应用:基于白冠鸡算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于白冠鸡算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于白冠鸡算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.白冠鸡算法4.实验参数设定5.算法结果6.参考文…

vue proxy代理 和 Nginx 配置跨域

vue.config.js文件中配置的代理&#xff1a; devServer: {port: 9095,// open: true, // 配置项目在启动时自动在浏览器打开proxy: {/yh: { // /api是代理标识&#xff0c;一般是每个接口前的相同部分target: "http://192.168.5.58:8002", // 请求地址&#xff0c;一…

4.3【共享源】克隆实战开发之截屏(一)

一,Screen截屏介绍 Screen的截屏是指从源读取像素,然后复制到缓冲区。然后可以根据需要操纵缓冲区;它可以简单地写入文件,也可以在其他窗口或显示器中使用。 Screen API从源中读取像素,并将其复制到提供的缓冲区中以捕获截屏。缓冲区可以是pixmap或窗口缓冲区,但必须设…

众和策略:美股全线上涨 中概股大涨

当地时间12月21日&#xff0c;欧洲股市全线下跌&#xff0c;英国富时100指数、法国CAC40指数、德国DAX指数均小幅下跌。美国通胀降温&#xff0c;美股商场三大指数尾盘飙升&#xff0c;纳斯达克指数、标普500指数均涨逾1%&#xff0c;大型科技股多数上涨&#xff0c;特斯拉涨近…

SoapUI、Jmeter、Postman三种接口测试工具的比较分析!

前段时间忙于接口测试&#xff0c;也看了几款接口测试工具&#xff0c;简单从几个角度做了个比较&#xff0c;拿出来与诸位分享一下。本文从多个方面对接口测试的三款常用工具进行比较分析&#xff0c;以便于在特定的情况下选择最合适的工具&#xff0c;或者使用自己编写的工具…

React + valtio 响应式状态管理

Valtio 是一个很轻量级的响应式状态管理库。valtio 让数据管理在 React 和原生 JS (Vanilla) 中变得更加简单的一个库&#xff0c;它类似于 Vue 的数据驱动视图的理念&#xff0c;使用外部状态代理去驱动 React 视图来更新。 一、状态管理库 dispatch 流派(单向数据流-中心化管…

Flink 运行时[Runtime] 整体架构

一、基本组件栈 在Flink整个软件架构体系中&#xff0c;同样遵循着分层的架构设计理念&#xff0c;在降低系统耦合度的同时&#xff0c;也为上层用户构建Flink应用提供了丰富且友好的接口。从下图中可以看出整个Flink的架构体系基本上可以分为三层&#xff0c;由上往下依次是 …

MT6739/MTK6739安卓核心板规格参数_MTK平台核心板定制

安卓核心板采用联发科 MT6739 平台开发设计&#xff0c;搭载开放的智能 Android 操作系统。它集成 GPU PowerVR GE8100 570MHz&#xff0c;集成了 BASEBAND、UMCP、PMU 等核心器件&#xff0c;支持 2.4G5G 双频 WIFI(可支持 1*1 MIMO)、BLUETOOTH 近距离无线传输技术&#xff0…

绩效面谈-大公司提高绩效的必杀技

绩效面谈是一种人力资源管理工具&#xff0c;旨在评估员工绩效并为其提供反馈。其意义包括&#xff1a; 为提高绩效制定具体的目标和计划。通过与员工讨论绩效表现&#xff0c;管理人员和员工可以确定明确的目标和方向&#xff0c;以实现更高的绩效水平。 帮助员工理解工作环…

【组合数学】Pólya 计数理论

目录 1. 引言2. 置换群3. Burnside 引理共轭类k 不动置换类Burnside 引理 4. Plya 计数定理4.1 对点着色问题4.2 对面着色问题4.3 重复球放盒子 1. 引言 Plya 计数理论是数学中的一个分支&#xff0c;主要研究的是对称性在组合计数问题中的应用。该理论以匈牙利数学家乔治波利…

关于使用libnet时性能下降的问题分析

Libnet是一个用于构建和注入网络数据包的便携式框架。它提供了在IP层和链路层创建数据包的功能&#xff0c;以及一系列辅助和补充功能。Libnet非常适合编写网络工具和网络测试代码。一些使用libnet的项目包括arping、ettercap、ipguard、isic、nemesis、packit、tcptraceroute和…

服务器加装了14T硬盘,显示不出来,戴尔R730阵列卡配置阵列RAID0

戴尔H730阵列卡配置阵列RAID0,1,5,10_哔哩哔哩_bilibili 然后依据下面的视频进行操作&#xff0c;ctrlr&#xff0c;选raid0 戴尔H730阵列卡配置阵列RAID0,1,5,10_哔哩哔哩_bilibili

【项目问题解决】% sql注入问题

目录 【项目问题解决】% sql注入问题 1.问题描述2.问题原因3.解决思路4.解决方案1.前端限制传入特殊字符2.后端拦截特殊字符-正则表达式3.后端拦截特殊字符-拦截器 5.总结6.参考 文章所属专区 项目问题解决 1.问题描述 在处理接口入参的一些sql注入问题&#xff0c;虽然通过M…

《Python Advanced Programming + Design Patterns + Clean Code》

清洁代码 — 学习如何编写可读、可理解且可维护的代码 高级Python编程知识 Python之常用设计模式 Advanced Programming装饰器 decorators生成器 & 迭代器with 上下文管理器面向对象Mixin 模式反射机制并发编程 Design Patterns设计模式分类简单工厂模式工厂模式 √抽象工厂…