
数据结构与算法
CJL爱吃鱼
鹅厂菜鸟
展开
-
剑指offer 最小的k个数 (快速排序)
题干如下:题目很简单,如果之间调用库函数sort(),两行代码就可以解决。class Solution {public: vector<int> getLeastNumbers(vector<int>& arr, int k) { sort(arr.begin(),arr.end()); vector<int> ans(arr.begin(),arr.begin()+k); return ans;原创 2021-03-14 19:38:42 · 114 阅读 · 0 评论 -
LeetCode 503 下一个更大的元素 (单调栈)
最近做每日一题,逐渐的有感觉了,虽然原题没做过,但是基本能想到其他题目类似的解法来解决不同的问题。比如这道题。题干如下:这一题要求下一个更大的元素,并且是当成循环数组来处理,所以,答案数组中,只可能最大的数没有下一个更大的数,其他的数都应该存在下一个更大的数。读完题目,立马想到一道类似的题:每日温度,解法也随之想到:单调栈!经过调试之后,修改完所有BUG,提交成功,代码如下:class Solution {public: //自己做出来的方法,单调栈,类似每日温度那题 vector&l原创 2021-03-07 16:03:43 · 166 阅读 · 0 评论 -
LeetCode 131 分割回文串(自己解法与官方解法对比)
今天力扣的每日一题,是关于回文串的题目,一想到回文串,脑海里已经浮现了两道经典的题目了,一道是求最长回文子串,一道是判断回文子串,响应的解法也浮现出来了。但是,今天这道题有点不一样。题干如下:题目要求所有非回文子串的分割方案。题目读完,脑海里浮现除了另外的一道类似的题目,组合总数。第一感觉需要使用到类似回溯的算法。经过分析,写出了下面的代码:自己解法:class Solution {public: //自己的解法 vector<vector<string>>原创 2021-03-07 15:30:56 · 135 阅读 · 0 评论 -
LeetCode 338 比特位计数(动态规划+位运算)
首先,题干如下:这一题要求给定数num从0—>num的二进制位的数组并返回该数组。最直观的解法就是直接求每个数的二进制位中1的个数,并返回数组。题解如下:直观解法:class Solution {public: //直接计算 vector<int> countBits(int num) { vector<int> numOfBit(num+1,0); for(int i = 0;i<=num;i++){原创 2021-03-03 22:47:41 · 206 阅读 · 1 评论 -
LeetCode 1438 绝对差不超过限制的最长连续子数组(滑动窗口,单调队列)
题目一看就是采用滑动窗口来解决,之所以记录一下是想复习一下单调队列的语法逻辑。题干如下:我们可以枚举每一个位置作为右端点,找到其对应的最靠左的左端点,满足区间中最大值与最小值的差不超过 \textit{limit}limit。注意到随着右端点向右移动,左端点也将向右移动,于是我们可以使用滑动窗口解决本题。这里我们需要一个数据结构来存储滑动窗口中的元素,并且需要对滑动窗口的元素进行排序,在C++中,map和set就有这样的功能,考虑到滑动窗口中的元素有可能重复,所以这里采用C++ STL中的mult原创 2021-02-22 20:55:37 · 278 阅读 · 0 评论 -
LeetCode 697 数组的度(一种哈希表的新的遍历方法)
在遍历哈希表的时候,我一般采取的是iterator的方法来遍历,这样遍历很不方便,在leetcode 697题中,了解了一种新的哈希表遍历方法,这种基于auto关键字的遍历应该是在C++ 11中支持的,非常方便。题干如下:题目本身不难,我们可以采用哈希表来记录数组中每个元素出现的频率,当出现频率最高的元素是唯一的时候,我们只要取该元素第一次出现和最后一次出现的区间长度,返回该区间的长度。当出现频率最高的元素不唯一时,我们需要比较他们的区间长度,取最小的区间长度返回。同时,每个元素的区间长度等于该元素原创 2021-02-22 11:40:43 · 205 阅读 · 0 评论 -
LeetCode 547 省份数量(图论复习:BFS、DFS、并查集)
这是一道经典的关于图论的联通分量的问题。题干如下:把n个城市和它们之间的关系看成图,城市是图中的节点。城市之间的相连关系看成图的边。题干中给出的isConnected矩阵就是典型的图论的邻接矩阵表示法,题干中要求得省份数量也就是图中的连通分量个数。统计图的连通分量个数,可以使用深度优先搜索,广度优先搜索和并查集。深度优先搜索(DFS):class Solution {public: //方法1:深度优先搜索 int findCircleNum(vector<vector<原创 2021-02-10 21:59:18 · 211 阅读 · 0 评论 -
LeetCode 480滑动窗口中位数(vector+选择排序)
这题我是直接采用选择排序写出来的,写出来去看官方解答,发现官方题解用的数据结构也太多了,实在让人看不下去,所以就记录下我的题解吧,欢迎大家讨论。首先我们需要一个数据结构来实时存储窗口中的值,并且要能够实时删除值,插入一个值,并且进行排序,然后找到中位数。这里我采用vector来存储,主要考虑到这个数据结构的大小不会变,只要存储k个元素,采用vector可以直接取下标,所以寻找中位数的时间复杂度是O(1)。接下来的问题就是要在排序好的数组中找到要删除的元素,这里的时间复杂度是O[k]。然后我把要插入的原创 2021-02-03 15:15:03 · 151 阅读 · 0 评论 -
LeetCode 424 替换后的最长重复字符(双指针法)
之前接触过不少双指针的题目,还都比较简单,不过这一题读完,我压根没想到会用到双指针,以为又是动态规划。题干如下:刚读完题目都没有读懂,看了下面两个例子才看明白。力扣官方解法给的是双指针的解法,但是其实这仅仅靠双指针并不能解决此题,还需要记录双指针left与right之间最高频率字母出现的次数。开始左右指针都处于0位置,起初我们先每次把右指针向右移动一个位置,然后更新当前字符出现的频率,然后更新最大频率,每次我们都需要判断,左右指针之间的字符数量如果已经超过最高频字符数量+可以改变k个字符的数量的话原创 2021-02-02 22:28:38 · 241 阅读 · 0 评论 -
LeetCode 839 相似字符串组(并查集解题模板)
一月的力扣每日一题似乎是并查集月,在一月的最后一天,总结一下并查集的解题模板吧。在解决图论相关问题的时候,如果我们不关心图的路径如何连接,而只关心图的连通性和连通分量的个数,我们可以考虑采用并查集来解决。并查集最重要的两个操作是查找和合并操作。同时,为了提高并查集的合并和查找效率,在查找的时候我们可以执行路径压缩,在合并的时候我们可以采取按秩合并的方案。接下来我总结了并查集这个数据结构的标准模板,包括了合并与查找操作。class UnionFind {public: vector<in原创 2021-01-31 13:02:18 · 196 阅读 · 0 评论 -
LeetCode 493翻转对 (归并排序算法总结)
今天在刷代码题的时候,又遇到了套用归并排序秒杀的解题模板。题目如下:这一题和《剑指offer》中逆序对哪一题如出一辙,都是用归并排序来解决的,当然力扣官方题解还介绍了别的一些高级的解法,我也不太熟悉,大家感兴趣的可以自己的学习。具体的分析我在代码注释中已经写得十分详细了,这里我主要是给自己备注一下,看不懂的可以去看力扣官方题解。class Solution {public: //与《剑指offer》中逆序对那题如出一辙,不理解可以参考官方题解 int reversePairs(vecto原创 2021-01-30 15:04:39 · 242 阅读 · 0 评论