![](https://img-blog.csdnimg.cn/20201209144818274.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
文章平均质量分 68
记录想法
眉毛以下截肢
努力打怪升级,努力变强!(ง •̀o•́)ง
展开
-
优先队列的第三个参数的实际含义,为什么less对应大顶堆,greater对应小顶堆;
因此,不难理解 less < 对应大顶堆了,当父结点小于子结点的时候,会进行交换,从而将大的值转换到父结点,从而堆顶就是最大元素了;priority_queue传入的第三个参数是仿函数,是将新插入数据与父结点进行比较,使用仿函数:if (com(_con[child] , _con[parent]))堆的本质是二叉树,堆排序就是将树的父结点与子结点进行比较、互换的结果;堆排序:就是将容器里面的数据按照堆特征进行排序;大顶堆,父结点比子结点大,所以堆顶是最大的;小顶堆,父结点比子结点小,所以堆顶是最小的;原创 2023-06-29 00:30:42 · 588 阅读 · 0 评论 -
十大排序算法归纳总结
倒逼法厉害了,在简历上面写了熟悉排序算法,所以对于常用的排序算法一定要手写一遍,噗!~原创 2021-08-04 16:31:28 · 108 阅读 · 0 评论 -
二叉树的构造总结 :前序+中序、中序+后续
文章目录前序+中序:中序+后序从前序与中序遍历序列构造二叉树从中序与后序遍历序列构造二叉树这两道题都是二叉树的构造,二叉树有三种遍历方式:前序:根左右中序:左根右后序:左右根 前序+中序得到完整的二叉树,首先由前序确定根结点的值,然后在中序序列中,找到根结点的位置,由此确定左子树的长度,进而可以递归得到完整的二叉树 同样,中序+后序也可以得到完整的二叉树,首先由后序遍历确定根结点的值,然后找到根结点在中序序列中的位置,确定左子树的长度,进而递归得到完整的二叉树这里面有两个地方原创 2021-07-26 15:35:31 · 345 阅读 · 0 评论 -
总结:动态规划(3)完全背包&&面试背包问题总结
文章目录完全背包518 零钱兑换II377 组合总和 Ⅳ70 爬楼梯322 零钱兑换279 完全平方数139 单次拆分多重背包总结完全背包完全背包和01背包的区别就是物品是否可以重复选取有N件物品和⼀个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。物品都有无数个,问将哪些物品装入背包里,物品价值总和最大?在01背包里面,如果使用滚动数组,对遍历顺序有要求,必须先遍历物品,再遍历背包,并且遍历背包需要从大到小,防止物品被重复添加;在完全背包里面,对于遍原创 2021-07-12 16:31:58 · 305 阅读 · 0 评论 -
总结:动态规划(2)01背包变形
文章目录01背包变形传统思路添加附件后的转换完整代码01背包变形华为机试HJ16购物单这一道题,有年终奖N,需要购买商品,商品有价格v[i],重要度p[i] ; 与一般的01背包不同的是,商品还含有附件,每个主件可以有0个、1个或2个附件,购买附件的话就需要购买主件(确实,不然我买这个干嘛呢?)传统思路 如果,不考虑附件,那么就是一个传统背包问题,总金额为N,物品价格为v[i],dp[i][j]表示在下标[0,i]中选取商品得到的最大满意度,满意度=价格*重要度;那么,就是:dp[i][原创 2021-07-08 19:58:44 · 172 阅读 · 0 评论 -
总结:动态规划(2)01背包
文章目录动态规划01背包01背包 二维数组01背包 滚动数组416 分割等和子集494 目标和474 一和零动态规划01背包01背包 二维数组有N件物品和⼀个最多能被重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每 件物品只能⽤⼀次,求解将哪些物品装⼊背包⾥物品价值总和最⼤。暴力解法 :很多题目上来,应该先看看暴力解法,暴力解法代表了最顺畅的思路,在此基础上才延伸出其他巧妙地解法。本题每件物品有两种状态:选、不选,那么可以通过回溯法,列出所有可能的组合,计原创 2021-07-08 15:53:26 · 171 阅读 · 0 评论 -
总结:动态规划(1) 基础题型,动规五部曲
文章目录动态规划基础题509 fibonacci70 爬楼梯746 使用最小花费爬楼梯62 不同路径63 不同路径II343 整数拆分96 不同的二叉搜索树动态规划动规五部曲:确定dp数组以及下标含义;确定递推公式;dp初始化;确定遍历的顺序;举例推导dp数组;基础题509 fibonacci确定dp数组以及下标含义; dp[i]表示第i个fibonacci数确定递推公式;dp[i]=dp[i-1]+dp[i-2]dp初始化;dp[1]=0,dp[2]=1确定遍历的顺序;从1原创 2021-07-07 14:16:02 · 429 阅读 · 3 评论 -
总结:贪心 局部最优推出整体最优
就是一句话,局部最优推出全局最优,找不出反例,试试贪心原创 2021-06-07 00:17:50 · 804 阅读 · 0 评论 -
总结:回溯法-组合问题
刷题总结回溯法组合问题力扣77回溯法跟着一个很厉害的**博主(代码随想录)**的文章进行总结。回溯本质上还是遍历搜索,可以用于解决组合、分割、子集、排列、棋盘问题等等,里面有一句总结的非常到位:for表示横向搜索,递归表示纵向搜索;组合问题力扣77典型的组合问题,可以采用典型的解决方法;思路就是,固定一位,然后在余下的里面固定另一位;记录一下这里的一个错误,就是在最后退出的时候,最开始没有想清楚,手动clear了ans,导致了越界错误;因为我们是首先挑选一位放到ans,然后在余下的数里面原创 2021-05-31 20:43:55 · 728 阅读 · 0 评论 -
归并排序、求逆序对(offer51)
本题求数组中的逆序对,很自然的想到了两层for循环,然而困难题,一定超时!在评论区看到了一种利用归并排序“治”的过程,顺带将逆序对求出来了,记录一下,顺便将归并排序和快排做一个比较。目录归并排序cpp实现与快速排序进行比较快速排序cpp实现归并排序正如图所示,归并排序是将原数组不断的划分,然后开始合并,有点二分法的意思;到只剩一个元素的时候,开始合并,将小的有序数组合并为大的有序数组恰好,这个合并的时候,如果加一个比较的步骤,就可以求出逆序对的个数,例如:原本的数组是:【7,3,2,6,0,.原创 2021-05-28 15:10:13 · 113 阅读 · 0 评论 -
又学到一种结构:前缀树!
前缀树:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。 正好今天力扣每日一题遇上了,查缺补漏,安排上! 个人对前缀树的理解就是:不多写一个字母!!!比如你要存储word和world,那么最终集合里面在r的后面就开始分叉,一条路指向d,另一条路指向ld;实现分析假如我们存储的是原创 2021-04-14 21:40:57 · 126 阅读 · 0 评论 -
LRU缓存机制&分割回文串
文章目录1 LRU缓存机制完整代码2 分割回文串1 LRU缓存机制Least Recently Used,最近最少使用法则,如果容器的容量为N,那么容器里面总是保存最近使用的N个数据 设计实现LRU缓存机制,支持put操作,get操作(不存在就返回-1),要求时间复杂度为O(1);思考:首先由时间复杂度O(1),可以想到我们可能需要使用数组以及哈希表;然后我们需要根据数据的使用频率来调整数据,在适当的时候删掉最不经常用的数据,那么我们可能就需要一个支持双向的容器(deque、list); 我们原创 2021-03-19 17:24:09 · 106 阅读 · 0 评论 -
理解回溯后感觉八皇后不过如此
听师兄说,去年面试华为,上来就让手撕八皇后,结果师兄二话不说搞定,直接30W+,慕了!八皇后问题就是在一个8x8的棋盘上面放置8个棋子,每个棋子的上、下、左、右、左上、左下、右上、右下8个方向不能有其他的皇后。之前看着一道题的时候,感觉十分麻烦,总感觉细节太多了,然后只知道大的层面用一个dfs(by the way,个人理解,回溯是算法思想,DFS更多是实现工具,最根本的实现方法是递归)基本思路: 可以认为的控制一行一行的进行皇后放置,首先在第一行进行放置,然后在第二行进行放置…,最后每一行都.原创 2021-03-16 22:05:16 · 95 阅读 · 1 评论 -
LeetCode 8 字符串转数字 细节之处总结
总结,本题需要注意的细节之处有以下几点:1 字符如何转换为数字?2 如何在不使用long数据的情况下,判断数据是否溢出?1 字符如何转换为数字?可以直接使用字符char-‘0’得到对应的数字,然后乘10累加 int tmp=(s[i]-'0'); Ans=Ans*10+tmp;2 如何在不使用long数据的情况下,判断数据是否溢出? 由于int可表示的范围是[-231 ,231-1] 也就是[-2147483648 ,2147483647]我们可以通过比较当前值Ans与231/10的.原创 2021-03-15 20:47:17 · 128 阅读 · 0 评论 -
温故而知新:回溯 LeetCode22 、17
怕什么真理无穷,进一步便有一步的欢喜!原创 2021-03-10 21:19:11 · 78 阅读 · 0 评论 -
复习:找出两个正序数组的中位数
焦虑啊,最近准备面试才发现,原来有这么多没有看,原来不是光刷代码就行!!!原创 2021-03-08 20:54:53 · 78 阅读 · 0 评论 -
QuickSort 拿下!
刷力扣的一个目的就是暴露那些没有研究过的知识点,这就是非科班出身的程序员的必经过程,遇到困难,不要害怕,勇敢面对它,奥利给原创 2021-02-06 17:18:41 · 167 阅读 · 0 评论 -
二分法的简单总结:
最近,刷题遇到了二分法的题目,感觉绝大多数题目都是一个同样的套路:做100道题,不如静下心来总结几道题,将使用二分法的场景,使用二分法的步骤捋一捋,这样就是真正掌握了核心技术,而不是简单地背几个模板,有的可以应付过去,稍微变形一下,就无法动弹;1 首先是找元素,二分法可以使用对数级别的时间复杂度例如: {1,2,3,4,4,5,6} ,想要找到里面第一个4的位置;思路就是:每次取中点的元素,将其与target进行比较,如果小于4,说明4在右半部分,因此需要更新left;否则就是在左半部分,更新ri原创 2021-01-31 18:37:44 · 220 阅读 · 0 评论 -
返回全排列,力扣38.字符串的排列
时隔好久,又捡起了力扣,开始刷题,争取年前,把剑指offer刷完。力扣38,是要求出字符串的全排列,高中的时候学过排列与组合,因此可以迅速的推出所有的组合数为s!;我们可以采用DFS的方法,首先确定第一位,然后确定第二位,最终确定第n位,然后返回最终的结果;为了去除重复字符,可以利用一个unordered_set存储字符串,做一个“剪枝”操作。class Solution {public: vector<string> permutation(string s) {原创 2021-01-17 14:47:19 · 232 阅读 · 0 评论 -
二叉树的一些基本概念汇总
二叉树 :二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个结点(好像结点,节点均可;百度百科为结点,力扣官网为节点)子树:只要包含了一个节点,就必须包含这个节点下的所有节点;子结构:包含了一个节点,可以只取左子树或者右子树,或者都不取;二叉树的深度(高度):max(左子树深度,右子树深度)+1节点的度:该节点的分支的个数 :度为0,1,2原创 2020-12-21 20:23:15 · 418 阅读 · 0 评论 -
解惑药水:二叉树的前序,中序,后序,层序 遍历实现
目录二叉树的先序遍历二叉树的中序遍历二叉树的后续遍历二叉树的层序遍历二叉树的先序遍历 先序遍历就是按照遍历规则:根、左、右 如图,该二叉树的遍历顺序为:首先看根节点1,它没有左子树,所以先访问1,然后访问它的右子树2;节点2有左子树3,右子树4,所以先访问节点2,然后3,然后4;节点3没有左子树,所以先访问节点3,然后右子树5;节点5没有右子树,所以先访问节点5,然后左子树6;至此根节点左子树访问完毕;接着访问根节点的右子树4先访问节点4,然后左子树7,右子树8;因此,总的节点访问顺原创 2020-12-21 19:43:04 · 430 阅读 · 0 评论 -
十分钟总结一下今晚(力扣13)
今晚主要熟悉了DFS BFS 在一道题目里面的具体实现:这道题目有两种方法:文章目录DFS depth first search 深度优先搜索BFS breath first search 广度优先搜索DFS depth first search 深度优先搜索DFS采用递归的思想,直到找到最后一个满足条件的坐标,然后往回回溯;一般来讲,就是定义自己的dfs函数,它的返回值就是满足条件的坐标个数;例如在本题里面,我需要找出机器人可以到达的所有格子总数,也就是满足条件的坐标总数。我可以定原创 2020-12-15 22:01:27 · 83 阅读 · 0 评论 -
数组元素按照奇偶性左右排列,记录一个错误!!!(力扣 num 21)
看评论区的大哥大姐提供的思路是:1. 定义两个数组下标,记为i和j,分别指向数组的头和尾;2. 首先从左往右寻找第一个偶数,找到后,从右往左寻找第一个奇数;3. 交换,直到i>=j为止思路很清晰,实现也就几句代码的事情#include <iostream>#include <vector>using namespace std;vector<int> exchange(vector<int> &nums){ //..原创 2020-12-15 16:27:04 · 113 阅读 · 0 评论 -
力扣笔记:判断链表是否成环以及返回入环的第一个节点
从评论区看到的一个思路:1.首先快指针一定比慢指针多走n圈以上(n>=1)2.在慢指针走完第一圈之前,快指针一定会追上慢指针相遇的时候,慢指针走过的节点是:x+y;快指针走过的节点是x+n(y+z)+y;所以,2(x+y)=x+n(y+z)+y; x=z+(n-1)(y+z)也就是说:分别从头节点和相遇节点处出发的两个节点(temp1、temp2),每次移动一个节点,一定会在入环节点处相遇。且移动的节点数:temp1是:x,temp2是:z+(n-1)(y+z)顺便总结一下是否成环的判断.原创 2020-08-24 20:30:35 · 239 阅读 · 6 评论 -
奥利给:力扣160:相交链表
这一道题的思路:1、如国两个链表有一个为NULL,那就直接返回NULL;2、如果两个链表相交,那么搜索的长度=短链表的长度;3、题目默认不存在val相等,相等,突然不相等的情况;遇到的问题:测试用例,返回1,预期是8为什么?因为题目想要的是节点一样而不是节点值一样,对于两个值为1的节点,他们的前驱是不一样的,因此,第一个相等的节点是值为8的节点解决的方法:把判断值相等改为判断链表相等;/** * Definition for singly-linked list. * struct L原创 2020-05-24 15:03:47 · 175 阅读 · 0 评论 -
力扣141题,判断链表里面是否有环
总是不能够考虑到所有的情况,都快吐了总结:1.判断链表是否成环,主要看下一个节点是否为NULL,2.快慢指针1.首先没有节点、只有一个节点,肯定没有环2.有两个节点,如果没有环,head->next->next==NULL;所以1,2两种情况可以放到一起判断3.两个及两个以上节点,如果快慢指针相遇,那就是有环,如果下一个节点或者下下一个节点为NULL,就说明没有环,退出循环,返回false/** * Definition for singly-linked list. * str.原创 2020-05-21 18:01:35 · 313 阅读 · 0 评论 -
在空调开得过热的房间里面,摸鱼写下的动态规划碎碎念
动态规划: dynamic programming名字看起来很高大上,也不知道动态在哪里,做了一些题目,看了一些解释,感觉就是1 减少重复计算,2 有点递归的味道,首先从后往前推出状态方程,然后从前往后写出dp数组3 也有点高中数学归纳法的味道,新的值是由旧的值得到的今晚做的是 力扣 Offer 46. 把数字翻译成字符串记录一下这一题的思路,虽然都是评论区老哥老姐的杰作,但是看懂了,自己也重新码了一遍,顺带更多的理解动态规划的一般套路。给定一个数字,我们按照如下规则把它翻译为字符串:0 翻原创 2020-12-03 21:04:19 · 151 阅读 · 2 评论 -
注意:哈希映射存储字符的顺序与压入的顺序不一样!!
例如:我想要将“leetcode”存放到哈希映射里面,那么存储顺序应该是 l e t c o d;但是,输出的顺序是 d o l e t c#include <iostream>#include <unordered_map>using namespace std;int main(){ unordered_map<char, int> HashMap1; unordered_map<char, int> HashMap2;原创 2020-11-26 10:33:39 · 140 阅读 · 0 评论 -
STL容器之list的用法总结,附上程序
一直在看数据结构的视频,也在力扣上面刷了一些相关的题目,但是对于c++ 自带的list却从没有正儿八经使用过,所以,今天用一两个小时的时间,把list的用法总结一下,算是扫清一个知识疑惑。一、注意事项list是双向链表,可以在常规时间内在list的任意位置插入或删除元素,反之,不能像数组一样直接使用下标[n]来获取元素;使用的时候,添加头文件 #include二、list函数介绍...原创 2020-11-04 20:55:31 · 306 阅读 · 0 评论 -
数据结构.栈的C语言实现及中缀表达式转为后缀表达式
从今天开始,打算好好把学习数据结构的过程记录下来,学完后要复盘。原创 2020-03-10 13:56:00 · 885 阅读 · 2 评论 -
链表的C语言实现
之前学习链表的时候,用c++实现似乎都没有什么问题,但我换用c语言实现的时候,遇到了许多问题,尤其是segmentation fault,于是我花了一些时间,终于完成了c语言版本的链表,包括,单链表,循环链表,双链表,双循环链表;首先明确一个概念:头指针是链表的必需元素,链表可以没有头结点但不能没有头指针;头结点的数据域可以用来存放链表长度;没有头结点就是:数据从第一个结点开始存储,返回指...原创 2020-03-05 16:41:00 · 159 阅读 · 0 评论 -
c++的链表实现;快慢指针找出中间节点(鹅厂)
参考写一个完整的程序,实现随机生成20个元素的链表,找出中间节点(利用快慢指针)1、定义结点结构体struct ListNode{ int val; ListNode* next; ListNode() : val(), next() {} //无参构造函数 ListNode(int x) : val(x), next(NULL) {} //结构体的有参构造...原创 2020-02-20 00:21:38 · 365 阅读 · 0 评论 -
拉丁方阵-单循环链表
最近学习数据结构里的单循环链表,出了一个这样的题目,要求打印输出拉丁方阵拉丁方阵(英语:Latin square)是一种 n × n 的方阵,在这种 n × n 的方阵里,恰有 n 种不同的元素,每一种不同的元素在同一行或同一列里只出现一次。基本思想是两层n循环,外层循环里每一次将结点移动一位;内层循环里,依次将单循环链表的值赋给二维数组的一行代码如下://打印拉丁方阵,每一行每一列的元素...原创 2020-03-03 23:23:27 · 338 阅读 · 0 评论