leetcode双指针题解
本文是基本常见的双指针题解 一、双指针简介二、双指针题解11. 盛最多水的容器看的教程是这个 【盛最多水的容器 接雨水【基础算法精讲 02】】 https://www.bilibili.com/video/BV1Qg411q7ia/?share_source=copy_web&vd_source=423f876c33c4e702693ed0518402c4ff 1234567891011121314class Solution {public: int maxArea(vector<int>& height) { // 三个int类型的都要赋初始值. 尤其是ans初始值为0 // 因为ans返回值一定是正数, 所以在max函数里面不会影响判断 int ans = 0, l = 0, r = height.size() - 1; while(l < r){ int area = (r - l) * min(height[l],...
leetcode动态规划题解
本文是基本常见的动态规划题解 一、动态规划简介 0-1背包理论基础(一)动规五部曲分析 确定dp数组以及下标的含义 那么这里 i 、j、dp[i][j] 分别表示什么呢? i 来表示物品、j表示背包容量。 即****dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少****。 确定递推公式 以上过程,抽象化如下: ****不放物品i****:背包容量为j,里面不放物品i的最大价值是dp[i - 1][j]。 ****放物品i****:背包空出物品i的容量后,背包容量为j - weight[i],dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]且不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值 递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] +...
将 OpenXLSX 库添加到 C++ 项目
在现代 C++ 项目中,如果你需要读取或写入 Excel .xlsx 文件,OpenXLSX 是一个非常轻量级且纯 C++ 实现的开源库。本文将介绍如何将 OpenXLSX 库集成到你的 C++ 项目中,并提供示例代码帮助你快速上手。 一、OpenXLSX 简介OpenXLSX 是一个用标准 C++17 编写的库,用于读取和写入 .xlsx 文件。它不依赖任何平台特定组件,非常适合嵌入式系统、桌面程序甚至 CLI 工具中。 优点包括: 仅支持 .xlsx(基于 XML 的现代 Excel 格式) 纯 C++17 实现,跨平台 支持读取/写入工作表、单元格、行列等操作 二、安装 OpenXLSX方式一:使用 vcpkg 安装(推荐)如果你使用 vcpkg 作为包管理器,可以直接执行: 1vcpkg install openxlsx 并在你的 CMakeLists.txt 中添加: 12find_package(OpenXLSX CONFIG REQUIRED)target_link_libraries(your_target PRIVATE...
leetcode哈希表题解
本文是基本常见的哈希表题解 一、哈希表简介一般哈希表都是用来快速判断一个元素是否出现集合里 例如要查询一个名字是否在这所学校里。 要枚举的话时间复杂度是O(n),但如果使用哈希表的话, 只需要O(1)就可以做到。 我们只需要初始化把这所学校里学生的名字都存在哈希表里,在查询的时候通过索引直接就可以知道这位同学在不在这所学校里了。 将学生姓名映射到哈希表上就涉及到了hash function ,也就是哈希函数。 哈希函数,把学生的姓名直接映射为哈希表上的索引,然后就可以通过查询索引下标快速知道这位同学是否在这所学校里了。 如果学生的数量大于哈希表的大小怎么办,此时就算哈希函数计算的再均匀,也避免不了会有几位学生的名字同时映射到哈希表 同一个索引下标的位置。 接下来哈希碰撞登场 一般哈希碰撞有两种解决方法, 拉链法和线性探测法。 常见的三种哈希结构 数组 set map 大体的判断方式: 数组:使用场景哈希值比较小,范围可控,例如26个字母类似的(如果是1, 5,...
高性能网络编程The C10K problem
借着 C10K 问题一起探讨下高性能网络编程的几种方法。 9.1 The C10K problemC10K 问题是由一个叫 Dan Kegel 的工程师提在 1999 年提出来的:如何在一台物理机上,同时保持 10000 条连接(concurrently handling ten thousand connections)。 当然,在现在的条件下,我们使用 libevent 或者 Java Netty 等框架轻轻松松就可以写出支持并发数量超过一万的服务器,经过优化之后,甚至可以达到十万,乃至百万。但在 2000 年左右,解决 C10K 问题可是一个了不起的成就。 现在的问题称为C10M,也就是如何在一台物理机上同时保持一千万条连接! 我们首先来看一下,在系统资源层面是否能够同时支持 10000 条连接(TCP 连接)。 Q: 同时支持 10000 条连接需要大量消耗哪些资源呢? A: 文件描述符,内存,网络带宽。 文件描述符 每个客户端连接都需要在服务器上占用一个文件描述符。一旦文件描述符不够用了,新的连接就会被丢弃。在 Linux...
高性能网络编程IO多路复用之epoll
epoll的性能是最好的,即使在监听多达 10000 个文件描述符的情况下,其性能和监听 10 个文件描述符相比,差别也不大。而随着文件描述符的增大,select和 poll的性能逐渐变得很差。 1. epoll的使用首先,通过编写一个聊天室服务器的例子认识一下epoll。 使用epoll编写网络程序需要三个步骤:分别是epoll_create``epoll_ctl和epoll_wait。接下来,我们详细讲解一下这三个 API。 1.1 epoll_create()epoll_create()函数会创建一个 epoll 实例,并返回一个文件描述符指向该 epoll 实例。 12345#include <sys/epoll.h>int epoll_create(int size);// Returns: a file descriptor if OK; -1 on error and errno is set. 参数说明 size: 自Linux 2.6.8,参数size将被忽略,但是仍需传入一个大于 0...
高性能网络编程TCP编程
1. C/S 网络编程模型C/S 模型在我们日常生活中随处可见,比如网上购物,游戏,聊天等等软件,用的都是 C/S 模型。C/S 模型比较简单,它的一般流程如下图所示: 当一个客户端需要某个服务时,它会像对应的服务器发送一个请求。请求的格式是事先双方约定好的,以保证服务器可以解析这个请求。 服务器接收到请求后,会解析并处理这个请求。 服务器处理完请求后,会给客户端发送一个响应。响应可以是处理后的结果,也可以是指引客户端下一步操作的指示。 客户端接收到响应后,会解析响应并处理响应(当然客户端也可能什么都不做)。 服务器端是我们要关注的重点。它需要事先监听在一个众所周知的端口上,然后等待客户端的请求。一旦有客户端连接,服务器端就要消耗一定的计算机资源为它服务。服务器端是需要同时为成千上万的客户端服务的,因此,保证服务器端在海量的客户端访问时依然能保持稳定和高效,就至关重要。 客户端相对来说简单许多,它向服务器的监听端口发起连接请求。连接建立之后,他就可以和服务器端进行通信了。 2....
leetcode贪心算法题解
本文是基本常见的贪心算法题解 一、贪心算法简介贪心无套路. 思考局部最优解是什么, 然后思考局部最优能不能推出全局最优(没有严格证明, 就是感觉局部最优可以推理出全局最优,同时自己还想不到反例, 那么就可以试一试贪心的策略, 仅仅是尝试) 贪心算法一般分为如下四步: 将问题分解为若干个子问题 找出适合的贪心策略 求解每一个子问题的最优解 将局部最优解堆叠成全局最优解 这个四步其实过于理论化了,只要想清楚 局部最优 是什么,如果推导出全局最优,其实就够了. 贪心没有套路,说白了就是常识性推导加上举反例 二、贪心算法题解455. 分发饼干小饼干先喂饱小胃口 大饼干先喂饱大胃口 这两种思路都可以 下面是leetcode的解法,我第一次写也是这样的.方便好理解. 123456789101112131415161718192021class Solution {public: int findContentChildren(vector<int> &g, vector<int> &s) { int...
最小编辑距离算法及其在中文场景下的扩展
本文介绍最小编辑距离(Edit Distance)的原理、标准算法实现,并进一步探讨在处理中文字符串时的特殊处理方法。 一、最小编辑距离简介最小编辑距离(Minimum Edit Distance)是衡量两个字符串相似度的经典算法之一,其核心思想是:将一个字符串转换成另一个字符串所需的最少操作数。 典型的允许操作包括: 插入(Insert) 删除(Delete) 替换(Replace) 该算法常用于拼写纠错、字符串模糊匹配、自然语言处理等领域。 二、经典动态规划算法leetcode题目链接 72. 编辑距离 设 dp[i][j] 表示将字符串 A[0...i-1] 转换成字符串 B[0...j-1] 所需的最小操作数。 转移方程为: 12345dp[i][j] = min( dp[i-1][j] + 1, // 删除 A[i-1] dp[i][j-1] + 1, // 插入 B[j-1] dp[i-1][j-1] + cost // 替换 A[i-1] 为...
模板代码随想录算法训练营54期dayXX
模板代码随想录算法训练营54期dayXX