随笔分类 -  数据结构与算法

摘要:1. 双指针 双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。也可以延伸到多个数组的多个指针。 1)滑动窗口 若两个指针指向同一数组,遍历方向相同且不会相交,则也称为滑动窗口(两个指针包围的区域即为当前的窗口),经常用于区间搜索。 例题: class Solution { publ 阅读全文
posted @ 2023-10-06 21:43 blogzzt 阅读(100) 评论(0) 推荐(0) 编辑
摘要:思路 1. 初版 cmake + 单一.cpp文件 参考:https://blog.songjiahao.com/archives/362 2. 改良版 cmake + 源文件、头文件(含List、Tree等数据结构)分离 + gtest 参考:https://github.com/Pokerpok 阅读全文
posted @ 2023-09-10 16:27 blogzzt 阅读(192) 评论(0) 推荐(0) 编辑
摘要:怎么想到要用单调栈的? 这类题目的数据通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置(寻找边界),此时我们就要想到可以用单调栈了。 42. 接雨水 这道题就是要求解每一个柱子左边第一个比它高的柱子,以及右边第一个比它高的柱子,然后这两个柱子间形成的凹槽面积。 注意,是 阅读全文
posted @ 2023-09-03 15:54 blogzzt 阅读(74) 评论(0) 推荐(1) 编辑
摘要:单调栈是一种理解起来很容易,但是运用起来并不那么简单的数据结构。一句话解释单调栈,就是一个栈,里面的元素的大小按照他们所在栈内的位置,满足一定的单调性。 单调栈摸版 下面维护一个顶大底小的的单调栈(单调递减栈) stack<int> st; for(int i = 0; i < nums.size( 阅读全文
posted @ 2023-09-03 10:56 blogzzt 阅读(43) 评论(0) 推荐(1) 编辑
摘要:205. 同构字符串 此题是「290. 单词规律」的简化版,需要我们判断 s 和 t 每个位置上的字符是否都一一对应,即 s 的任意一个字符被 t 中唯一的字符对应,同时 t 的任意一个字符被 s 中唯一的字符对应。这也被称为「双射」的关系。 以示例 2为例,t 中的字符 a 和 r虽然有唯一的映射 阅读全文
posted @ 2023-08-20 17:59 blogzzt 阅读(22) 评论(0) 推荐(0) 编辑
摘要:分治思路:对于一个算式来说,总是可以根据运算符分为左右两部分算式,接着分别计算结果并合并;每一个结果都是一个数组,包含这个算式的所有可能结果,计算时将左右两部分排列组合;递归的终点是字符串是纯数字(即分到一个算式中只剩下一个数字),直接返回。 比如示例中的2*3-4*5,有下面的分法: 1、分为2与 阅读全文
posted @ 2023-08-13 14:30 blogzzt 阅读(13) 评论(0) 推荐(0) 编辑
摘要:一、简介 回溯法(backtracking)是优先搜索的一种特殊情况,又称为试探法,常用于需要记录节点状态的深度优先搜索。通常来说,排列、组合、选择类问题使用回溯法比较方便。 解题套路: result = [] def backtrack(路径, 选择列表): if 满足结束条件: result.a 阅读全文
posted @ 2023-04-08 21:36 blogzzt 阅读(529) 评论(0) 推荐(0) 编辑
摘要:417. 太平洋大西洋水流问题 虽然题目要求的是满足向下流能到达两个大洋的位置,如果我们对所有的位置进行搜索,那么在不剪枝的情况下复杂度会很高。因此我们可以反过来想,从两个大洋开始向上流,这样我们只需要对矩形四条边进行搜索。搜索完成后,只需遍历一遍矩阵,满足条件的位置即为两个大洋向上流都能到达的位置 阅读全文
posted @ 2023-04-02 21:34 blogzzt 阅读(15) 评论(0) 推荐(0) 编辑
摘要:leetcode 347. 前 K 个高频元素 顾名思义,桶排序的意思是为每个值设立一个桶,桶内记录这个值出现的次数(或其它属性),然后对桶进行排序。 红色代表频率。 最后,我们从后往前遍历,直到找到k个旧桶。 class Solution { public: vector<int> topKFre 阅读全文
posted @ 2023-04-01 11:47 blogzzt 阅读(17) 评论(0) 推荐(0) 编辑
摘要:快速排序 快速排序算法的实现思路是: 从待排序序列中任选一个元素(假设为 pivot)作为中间元素,将所有比 pivot 小的元素移动到它的左边,所有比 pivot 大的元素移动到它的右边;(这一步被称为「划分 partition」) pivot 左右两边的子序列看作是两个待排序序列,各自重复执行第 阅读全文
posted @ 2023-03-19 23:06 blogzzt 阅读(303) 评论(0) 推荐(0) 编辑
摘要:具体到代码上,二分查找时区间的左右端取开区间还是闭区间在绝大多数时候都可以,因此有些初学者会容易搞不清楚如何定义区间开闭性。这里我提供两个小诀窍,第一是尝试熟练使用一种写法,比如左闭右开(满足C++、Python 等语言的习惯)或左闭右闭(便于处理边界条件),尽量只保持这一种写法;第二是在刷题时思考 阅读全文
posted @ 2023-03-14 23:32 blogzzt 阅读(737) 评论(0) 推荐(0) 编辑
摘要:一但要求下一个更大的元素,就是用单调栈解,力扣题库相似的题目都是这个解法。 栈(stack)是很简单的一种数据结构,先进后出的逻辑顺序,符合某些问题的特点,比如说函数调用栈。 单调栈实际上就是栈,只是利用了一些巧妙的逻辑,使得每次新元素入栈后,栈内的元素都保持有序(单调递增或单调递减)。 例题: 4 阅读全文
posted @ 2023-03-04 20:20 blogzzt 阅读(20) 评论(0) 推荐(0) 编辑
摘要:一、概念 问题可以描述为:给定一组物品(有N 个物品和容量为W 的背包,每个物品都有自己的体积w 和价值v),在限定的总重量内,我们如何选择,才能使得物品的总价格最高。 常见的有01背包问题,即限定每种问题只能取0个或1个。 问:要使背包装的物品价值最大,应该怎么选,最大值是多少? 二、动态规划解法 阅读全文
posted @ 2023-02-19 18:01 blogzzt 阅读(27) 评论(0) 推荐(0) 编辑
摘要:一、概念 字典树(Trie)用于判断字符串是否存在或者是否具有某种字符串前缀。 包含三个单词 "sea","sells","she" 的 Trie 长这样: 为什么需要用字典树解决这类问题呢?假如我们有一个储存了近万个单词的字典,即使我们使用哈希,在其中搜索一个单词的实际开销也是非常大的,且无法轻易 阅读全文
posted @ 2023-02-19 11:45 blogzzt 阅读(17) 评论(0) 推荐(0) 编辑
摘要:什么是遍历: 所谓遍历(Traversal),是指沿着某条搜索路线,依次对树(或图)中每个节点均做一次访问。访问结点所做的操作依赖于具体的应用问题, 具体的访问操作可能是检查节点的值、更新节点的值等。 命名 根据访问结点操作发生位置命名: ① NLR:前序遍历(PreorderTraversal亦称 阅读全文
posted @ 2023-02-08 23:37 blogzzt 阅读(137) 评论(0) 推荐(0) 编辑
摘要:编程语言中,我们习惯将函数调用自身的过程称为递归,调用自身的函数称为递归函数,用递归方式解决问题的算法称为递归算法。 设计递归函数时,我们必须为它设置一个结束递归的“出口”,否则函数会一直调用自身(死循环),直至运行崩溃。接下来我们以“用递归方式求 n! ”为例,给大家展示一个正确的递归函数。 #i 阅读全文
posted @ 2023-02-08 23:08 blogzzt 阅读(203) 评论(0) 推荐(0) 编辑
摘要:题目:542. 01 矩阵 题解: 一、广度优先搜索 如果从每个1出发,广度优先搜索它临近的0,每一次搜索,只能更新当前1的信息,会比较耗时。因此,我们可以从矩阵中的所有0出发,寻找到每个1的距离,这个方法也称多源广度优先搜索。 例如:1、从所有的0出发搜索,找到了5个1(浅黄绿色)(距离为1),再 阅读全文
posted @ 2023-01-14 17:48 blogzzt 阅读(32) 评论(0) 推荐(0) 编辑
摘要:拓扑排序定义 给定一个包含 n 个节点的有向图 G,我们给出它的节点编号的一种排列,如果满足: 对于图 G 中的任意一条有向边 (u, v),u 在排列中都出现在 v 的前面。 那么称该排列是图 G 的「拓扑排序」。 题目与解析 lc 210. 课程表 II 我们可以将本题建模成一个求拓扑排序的问题 阅读全文
posted @ 2022-12-18 22:36 blogzzt 阅读(48) 评论(0) 推荐(0) 编辑
摘要:二分图的概念 二分图就是顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集,两个子集内的顶点不相邻。 染色法概念 二分图算法也称为染色法。如果可以用两种颜色对图中的节点进行着色,并且保证相邻的节点(边两端的节点)颜色不同,那么图为二分。 下图中有相邻节点的颜 阅读全文
posted @ 2022-12-18 17:51 blogzzt 阅读(336) 评论(0) 推荐(0) 编辑
摘要:一、什么是深度优先遍历(DFS) 以“深度”为第一关键词,每次都沿路径到不能再前进时,才退回到最近的岔路口,然后继续按同样的逻辑搜索。 二、题目与解答 题目: Leetcode 695. 岛屿的最大面积 解答思路: 首先要遍历数组,当发现(i,j)对应为陆地时,进行如下步骤: (1)递归解法 递归解 阅读全文
posted @ 2022-12-10 21:44 blogzzt 阅读(77) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示