算法—STL与数据结构
文章平均质量分 68
算法——STL与数据结构
沉迷单车的追风少年
CSDN博客专家,CSDN商业化专家,官方内容合作伙伴,官方认证“人工智能领域优质创作者”,入选2023年中国开发者影响力年度榜单。
代表专栏《Diffusion Models与深度学习》、《手把手写深度学习》、《深度学习-计算机视觉》、《手把手写C++服务器》等。
展开
-
哈希表——从LeetCode实战中总结常用套路
本来想总结一下套路,结果写完发现这一篇博客成了水题合集不过还是有很多思考与启发的!目录LeetCode1365.有多少小于当前的数字LeetCode771.宝石与石头LeetCode面试题16.02.单词频率LeetCode1207.独一无二的出现次数LeetCode500.键盘行LeetCode349.两个数组的交集LeetCode面试题03.数组中重复的数字...原创 2020-03-07 21:20:30 · 783 阅读 · 1 评论 -
回文——LeetCode题海实战总结
前言:今天是1024程序员节,先祝大家节日快乐!回文类题目的核心是双指针法,稍微进阶的题目会要先要进行一些预处理,再难一点的题目会结合动态规划、数论、链表等形式进行考察。原创 2020-10-24 11:55:38 · 467 阅读 · 4 评论 -
反转字符串——从LeetCode题海中总结常见套路
前言:面试一般很少出现这类题目,但是笔试经常有,反转字符串还是能体现很多编程基本功的。下面就LeetCode当中所有反转字符串的题目全部一网打尽。反转链表也是一类经典的题目,值得专门写一篇blog,本文不表。原创 2020-08-30 16:03:59 · 336 阅读 · 2 评论 -
字母异位——从LeetCode题海中总结常见套路
字母异位词在NLP领域中很有用处,同时最早在十几年前微软的面试中被奉为经典,这类题可以涉及哈希表、滑动窗口、、动态规划、双指针等综合知识点,其中也是套路满满,奇技淫巧也是层出不穷,这里仅仅总结一下常见的套路,求道不求术,小众方法、歪门邪道暂且不表。目录最主要的套路有两个:套路入门级:LeetCode242.有效的字母异位词建立哈希表法建立26个字母表法建立字母表:LeetCode1347.制造字母异位词的最小步骤建立哈希表法:LeetCode49.字母异位词分组多种套路:Le原创 2020-07-09 19:52:02 · 554 阅读 · 3 评论 -
从LeetCode.strStr()出发理解KMP算法
目录从一道LeetCode谈起双指针(暴力)解法KMP出场C语言描述C++描述参考最早接触KMP算法应该是在一年前,当时买了北邮的那本数据结构与STL,由于是给通信背景的学生用的,并且教材是NLP出身的老师写的,所以介绍了KMP算法(一般数据结构教材里根本没有这个),但是短短几行根本没弄懂从一道LeetCode谈起双指针(暴力)解法这是最容易想到的方法顺利ACclass Solution {public: int strStr(string原创 2020-06-27 19:47:45 · 489 阅读 · 0 评论 -
经典栈——从LeetCode题海中总结常见套路
主要分成三大类:括号类、栈类设计题、逆波兰类括号类栈题栈的常规思路题:LeetCode20.有效的括号LeetCode1021.删除最外层的括号LeetCode921.使括号有效的最少添加栈类设计题用数组模拟栈:LeetCode1381.设计一个支持增量操作的栈vector模拟:LeetCode155.最小栈双栈模拟队列:LeetCode面试题09.用两个栈模拟队列逆波兰算法及其延伸逆波兰:Leetcode150.逆波兰表达式求值逆波兰延伸:LeetCod原创 2020-04-30 12:16:47 · 447 阅读 · 0 评论 -
LeetCode经典——202.快慢指针之快乐数
目录瞎暴力1:找出死循环数的规律瞎暴力2:遇到超过100次以上循环还没找到认为是死循环快慢指针法:这题真的是很有意思!先看题目:可以看出关键是判断是否有死循环的出现!怎么判断呢,有很多中投机取巧的方法,先看两个:瞎暴力1:找出死循环数的规律所有不快乐数的数位平方和计算,最後都会进入 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 →...原创 2020-04-12 21:18:03 · 316 阅读 · 0 评论 -
Leetcode经典系列——LRU最近最少使用机制
目录LeetCode题目:用两个栈实现,会超时:哈希+链表改进分析:简写:Least Recently Used,是一种常用的页面置换算法,是一种缓存淘汰策略。计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置。但问题是,删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用。那么,什么样的数据,我们判定为「有用的」的...原创 2020-04-12 16:36:06 · 662 阅读 · 0 评论 -
字符串水题——从LeetCode题海中总结常见套路
字符串的题大部分都很水,但是一些企业机试经常出现(比如华为)另外不水的题常常和DP/贪心/回溯连在一起比较难,还是多练吧后面用Golang提交试试水,最近在学Golang,非常有意思原创 2020-04-05 09:46:46 · 468 阅读 · 0 评论 -
LeetCode331.验证二叉树的前序序列化
题目:思路:这道题是我今天目前碰到最有意思的题,首先思考只有前序遍历是无法完全确立重建二叉树的在无法确立二叉树的情况下,得想想二叉树的其他性质利用性质:空节点视为叶节点,根据性质叶节点数目比非叶节点数目多1来判断。我们可以定义一个概念,叫做槽位,二叉树中任意一个节点或者空孩子节点都要占据一个槽位。二叉树的建立也伴随着槽位数量的变化。开始时只有一个槽位,如果根节点是空节...原创 2020-03-31 10:23:59 · 286 阅读 · 0 评论 -
栈——从LeetCode题海中总结常见套路
LeetCode1021.删除最外层的括号这题真妙啊,要不是看了评论区,怎么也不会想到可以用栈来求解!class Solution {public: string removeOuterParentheses(string S) { string res = ""; stack<char> mystack; for (int i = 0; i <...原创 2020-03-30 23:12:16 · 547 阅读 · 0 评论 -
旋转、反转、重排链表——从LeetCode题海中总结常见套路
目录LeetCode92.反转链表II栈解法常规链表操作解法:LeetCode61.旋转链表LeetCode143.重排链表先来段投机的:正常链表操作:LeetCode328.奇偶链表很符合队列的性质,先用双队列A了正常链表操作:LeetCode92.反转链表II首先不涉及链表的新增,所以第一想法就是用栈解决栈解法/** * Def...原创 2020-03-18 17:20:43 · 498 阅读 · 0 评论 -
新建链表——从LeetCode题海中总结常用套路
新建链表基本方法:新建链表类型题目的套路:这一类满满的套路,对指针的理解要求比较深入,如果不没总结过套路的话,肯定一脸懵逼……首先new一个头指针 ListNode* head = newListNode(0); 然后定义一个当前结点,并指向头指针 ListNode* cur = head; 接下来对cur结点进行操作; 每次一顿操作完之后记得将 cur = cur-&...原创 2020-03-16 21:47:40 · 890 阅读 · 0 评论 -
剑指offer——四种方法解链表相交
目录LeetCode面试题02.07.链表相交思路一:暴力解法思路二:栈思路三:长链表先走思路四:双指针LeetCode面试题02.07.链表相交看图,相交是这个意思:思路一:暴力解法面试要是这么写就挂了……思路二:栈因为链表只能从前到后进行遍历,而如果两个链表会相交的话,从后面倒数n个都会是相同的 这种先入后出的形式明显是栈 以空间换取...原创 2020-03-16 17:02:17 · 261 阅读 · 0 评论 -
归并排序与链表
数组的归并排序:典型的分治思想//归并排序#include <iostream>using namespace std;const int MAX = 500;const int SENTINEL = (1<<21);//定义无穷大的数int L[MAX/2+2],R[MAX/2+2];//定义长度的时候记得+2void merge(int A[]...原创 2020-03-16 09:46:51 · 255 阅读 · 4 评论 -
数组水题合集——LeetCode题海实战汇总
目录LeetCode1295.统计位数为偶数的数字LeetCode面试题16.01.交换数字LeetCode1313.解压缩编码列表LeetCode1351.统计有序矩阵中的负数LeetCode1295.统计位数为偶数的数字常规解法,一分钟没AC就算不合格吧class Solution {public: int findNumbers(vector<...原创 2020-03-14 22:57:08 · 467 阅读 · 0 评论 -
剑指offer——三步走法原地修改解复制复杂链表
用哈希表不是最佳答案,最好的方法是原地修改法:复制一个新的节点在原有节点之后,如 1 -> 2 -> 3 -> null 复制完就是 1 -> 1 -> 2 -> 2 -> 3 - > 3 -> null 从头开始遍历链表,通过 cur.next.random = cur.random.next 可以将复制节点的随机指针串起来,当然需要判...原创 2020-03-14 10:42:50 · 235 阅读 · 0 评论 -
剑指offer——6.从头到尾打印链表的三种解法
目录方法一:修改链表结构,将节点的指针反转方法二: 栈/reverse方法三:递归方法一:修改链表结构,将节点的指针反转一般打印操作不要修改原结构,抛弃此方法方法二: 栈/reverse这种先入后出的结构当然会想到栈stack 此处要返回vector,所以用C++库函数reverse更方便/*** struct ListNode {* int v...原创 2020-03-13 21:02:53 · 237 阅读 · 0 评论 -
删除链表——从LeetCode题海中总结常见套路
删除链表类的题目不难,全是套路,刷过就很简单目录删除链表结点套路总结:LeetCode203.移除链表元素LeetCode面试题18.删除链表的节点LeetCode237.删除链表中的结点LeetCode83.删除排序链表中的重复元素LeetCode82.删除排序链表中的重复元素II面试题02.01.移除重复节点删除链表结点套路总结:虚拟新建虚拟头结点dum...原创 2020-03-13 19:54:04 · 395 阅读 · 0 评论 -
LeetCode哈希表+字符类的题目总结
找字符类的题目比较简单,也很常见一般思路就是利用字符对应的ASCII码表生成一个哈希表记录字符出现的次数然后再根据题意进行查找LeetCode1160.拼写单词class Solution {public: int countCharacters(vector<string>& words, string chars) { ...原创 2020-03-13 11:18:52 · 317 阅读 · 0 评论 -
合并、转换、分隔链表——从LeetCode题海中总结常用套路
基本知识点:链表(Linked List)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必须按顺序存储,链表在插入的时候可以达到 O(1)O(1)O(1) 的复杂度,比另一种线性表 —— 顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要 O(n)O(n)O(n) 的时间,而顺序表...原创 2020-03-12 22:53:38 · 302 阅读 · 2 评论 -
快慢指针——从LeetCode题海中总结常用套路
目录双指针分类:快慢指针典例:判断链表中是否有环LeetCode141.环形链表进阶问题:已知链表中含有环,返回这个环的起始位置LeetCode142.环形链表快慢指针典例:寻找链表的中间结点LeetCode876.链表的中间结点进阶问题:寻找链表的倒数第 k 个元素LeetCode面试题02.02.返回倒数第k个结点参考:双指针分类:快慢指针:常用...原创 2020-03-12 20:05:02 · 752 阅读 · 0 评论 -
位运算——从LeetCode题海中总结常见套路
目录位运算常用技巧&运算判断2的幂:LeetCode231.2的幂左移运算右移运算LeetCode1290.二进制链表转整数常规递归法:使用位移运算LeetCode191.位1的个数:“与”运算后右移异或运算:LeetCode461.汉明距离常规方法:记得末尾补0位运算:异或运算后统计1的个数位运算+DP: LeetCode338.比特位计数LeetCode190.颠倒二进制位经典异或运算:LeetCode136.只出现一次的数字有...原创 2020-03-10 18:15:27 · 583 阅读 · 2 评论 -
STL常见坑——访问set中最后一个元素
set功能表:大家都知道set.end()访问最后一个元素,似乎没有任何问题可是真的是这样吗???看个例子://test#include <iostream>#include <set>using namespace std;int main(){ set<int> s; s.insert(100); ...原创 2020-02-17 10:22:22 · 11246 阅读 · 2 评论 -
数据结构基础——list操作双向链表
list和vector极为相似,不同之处是list可以元素在插入和删除操作时算法复杂度只需要O(1)即可,vector见:https://blog.csdn.net/qq_41895747/article/details/95381008与vector比较:vector擅长对元素的随机访问,但付出的代价是在其任意位置插入或删除元素,都比在尾部插入或删除的开销大。 list可以在任意位置快...原创 2019-07-10 22:23:20 · 249 阅读 · 0 评论 -
vector动态数组和顺序性容器初始化的五种方式
使用STL的vector实现动态数组,示例功能如下:函数名 功能 push_back(x) 在向量末尾添加元素 pop_back(x) 删除向量最后一个元素 begin() 返回指向向量开头的迭代器 end() 返回指向向量末尾的迭代器 insert(p,x) 在向量p位置处插入元素x erase(p) 删除向量...原创 2019-07-10 21:16:08 · 395 阅读 · 0 评论 -
queue队列、deque双端队列和priority_queue优先队列
在C++STL中,使用#include <queue>使用队列,成员函数示例如下:函数名 功能 size() 返回队列中元素 front() 返回队列中头元素 pop() 从队列中取出并删除 push() 从队列中添加元素 empty() 队列为空时返回true 示例代码,注意需要事先声明队列#inc...原创 2019-07-10 20:55:29 · 301 阅读 · 0 评论 -
STL——string使用总结
STL用于处理可变长度的字符串处理,具体用法如下:STL string使用示例 操作接口实例 说明 s.empty() 如果s为空,则返回true;否则返回false s.size() 返回s中字符的个数 s[n] 返回s中位置为n的字符,注意从0开始计算 s1+=s2 或 s1=s1+s2 将上s2追加到s1后面 s.insert(p...原创 2019-09-28 20:53:22 · 246 阅读 · 0 评论 -
STL排序总结与std::sort()底层原理
目录排序分类分类外部排序方法:数据内外存交换和数据归并STL排序STL比较函数排序分类分类内部排序 将排序数一次性装入内存 外部排序 相反。速度慢 外部排序用于排序文件很大,无法将整个文件装入内存,只能将文件装入外存上。外部排序方法:数据内外存交换和数据归并将待归并记录分成若干长度t的段R1,R2…… 利用上述内部排序方法,对每...原创 2019-09-21 22:08:47 · 1740 阅读 · 0 评论 -
set与map使用总结
管理元素集合的STL容器分类:序列式容器:有顺序的集合。序列式容器会将添加的元素位于特定的位置,该位置由插入的时间和地点确定,与元素本身的值无关。如vector、list等。 关联式容器:经过排序的集合。关联式容器会根据特定的排序标准来决定要添加元素的位置。如set、map。set集合:根据元素进行排序的集合,所插入的元素在集合中唯一,不存在重复元素。set由二叉搜索树实现,而且对树进...原创 2019-09-13 23:43:55 · 399 阅读 · 0 评论 -
STL——stack栈(解决逆波兰算法)
逆波兰算法:假定给定一个只 包含 加、减、乘、除,和括号的算术表达式,你怎么编写程序计算出其结果?问题是:在表达式中,括号,以及括号的多层嵌套 的使用,运算符的优先级不同等因素,使得一个算术表达式在计算时,运算顺序往往因表达式的内容而定,不具规律性。 这样很难编写出统一的计算指令。使用逆波兰算法可以轻松解决这个问题。他的核心思想是将普通的中缀表达式转换为后缀表达式。什么是中缀表达式?...原创 2019-07-10 18:06:54 · 397 阅读 · 0 评论