数据结构算法
数据结构代码及分析
IT奶牛
真困啊
展开
-
回溯算法总结
B站参考视频。原创 2021-03-19 21:41:52 · 163 阅读 · 0 评论 -
LeetCode 84. 柱状图中最大的矩形
原题链接学习关于单调栈的使用。求连在一块的柱状构成的最大矩形的面积,整体思路是:从左到右依次遍历,如果当前柱状条的高度严格大于下一个柱状条,那么由当前柱状限制的最大面积的矩形就可以确定了。这符合单调性质。如果未能满足 1 中的条件,则需要暂时放过去考虑下一个柱状条,然后再从大到小遍历。符合栈的结构。因为柱状条的下标与矩形的宽度有关系,所以栈结构中存放的是某个条的下标。思路参考给出代码:class Solution {public: int largestRectangleAre原创 2021-03-19 14:47:41 · 90 阅读 · 0 评论 -
LeetCode 837. 新21点
原题链接思路动态规划问题,从后往前考虑。在优化时间复杂度的时候,将前后两项相同的部分消去。关于找状态转移方程的方法,一点感悟是:先定数组形式。一维数组找前后关系,二维数组找临近关系。代码:class Solution {public: double new21Game(int N, int K, int W) { if(K == 0) return 1.0; vector<double> res(K + W); for(int原创 2021-03-08 17:53:31 · 71 阅读 · 0 评论 -
算法小点集合
排列组合之隔板法原创 2021-03-08 16:06:36 · 262 阅读 · 0 评论 -
LeetCode 1314. 矩阵区域和
原题链接本题为数组的二维前缀/行/列 前缀和 的应用。通过前缀和之间 的关系可以得到某区域内结果。代码参考class Solution {public: int get(const vector<vector<int>>& pre, int m, int n, int x, int y) { x = max(min(x, m), 0); y = max(min(y, n), 0); return pre[x][原创 2021-03-08 12:11:43 · 74 阅读 · 0 评论 -
LeetCode 110. 平衡二叉树
原题链接使用深度优先递归检验一棵二叉树是否是平衡二叉树:代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), le原创 2021-03-02 12:47:39 · 55 阅读 · 0 评论 -
LeetCode 1239. 串联字符串的最大长度
原题链接思路:将26个字母用32位二进制表示独立。如果两个string字母均不同,则二者做与操作结果为0.将没有重复字母的string挑出来,转换为数字处理按照深度优先处理参考了花花酱的B站视频:代码中使用了模板函数 与 C++匿名函数,值得学习。class Solution {public: int maxLength(vector<string>& arr) { vector<int>a; // 清洗arr,原创 2021-01-28 21:05:51 · 123 阅读 · 0 评论 -
LeetCode 743. 网络延迟时间
原题链接一道弗洛伊德算法基本应用,计算网络传播耗时,图论基础。记录一下。代码出处class Solution {public: int networkDelayTime(vector<vector<int>>& times, int N, int K) { const int INF = 0x3f3f3f3f; vector<vector<int>> d(N+1, vector<int>(N+原创 2021-01-19 18:12:49 · 75 阅读 · 0 评论 -
LeetCode 954. 二倍数对数组
原题链接使用hash表统计每个数字出现的次数,分正负考虑二倍情况,直接在数组中每个元素数量上进行操作。当2倍(负数为1/2)元素的数量减去当前值的数量小于0时候,证明当前值会有多余,不匹配。还利用了map自动排序的功能。自己写的代码不太好,参考了题解class Solution {public: bool canReorderDoubled(vector<int>& A) { map<int, int> cnt; int原创 2021-01-17 19:00:52 · 117 阅读 · 0 评论 -
算法题模板(待补充)
DFS 与 BFS层序遍历BFS,需要维护一个层数的变量 level。参考模板及本题题解 DFS 与 BFS。vector<vector<int>> levelOrder(TreeNode* root) { queue<TreeNode*> q; q.push(root); //... while(q.size()) { int size=q.size(); //... for.原创 2021-01-11 02:19:44 · 160 阅读 · 0 评论 -
LeetCode 17. 电话号码的字母组合
原题链接初次见这样的题,记录一下。方法一: 深度优先搜索方式:递归枚举,递归出口是当字符串为空时候返回。参考官方代码:class Solution {public: vector<vector<string>> getNumPad(){ vector<vector<string>> numPad; numPad.push_back({" "}); numPad.push_back({""});原创 2021-01-09 16:09:44 · 71 阅读 · 0 评论 -
LeetCode 605. 种花问题
原题链接一道贪心思想的题目思路:每遇到一个可以种花的地方 n 就减一;当满足 n <= 0即满足题目true,返回;遇到已经有花的地方就继续遍历下一个地方;遇到没花的地方,看前面是否有花,后面是否有花,满足条件则种花,即 n 减一;遍历完最后一个元素后返回 n <= 0 的布尔值。时间复杂度为O(n),空间复杂度为O(1)。代码:class Solution {public: bool canPlaceFlowers(vector<int>&原创 2021-01-08 15:30:56 · 74 阅读 · 1 评论 -
LeetCode 219. 存在重复元素 II
原题链接思路:方法一:哈希表存储<value - index>对,先查找是否存在该nums[i],若不存在,则插入;若存在,比较存储的index值与当前下标的差值的绝对值与k的大小,满足条件即返回true,结束返回false。空间复杂度为O(n),时间复杂度为O(n^2)方法二:利用无序set建一个大小为 k 的滑动窗口,判断窗口内是否有重复元素,如果有则返回true,结束返回false。方法一代码:class Solution {public: bool containsN原创 2021-01-08 01:58:10 · 67 阅读 · 0 评论 -
LeetCode 1588. 所有奇数长度子数组的和
原题链接一道简单题的套路性解法,找各个元素出现次数的规律。思路:要求子数组的长度为奇数,如果以当前元素 arr[i] 为中心,那么只有两种情况:__左右两边均为奇数个元素__左右两边均为偶数个元素找出对应情况的数,相乘即为该元素在最终求和里面出现的次数。代码:class Solution {public: int sumOddLengthSubarrays(vector<int>& arr) { if(arr.empty()) return原创 2021-01-08 01:19:11 · 126 阅读 · 2 评论 -
LeetCode 1438. 绝对差不超过限制的最长连续子数组
原题链接思路:使用双端队列维护单调队列,因为过程中需要得到某一段数组的最大值和最小值,在单调队列的队首和队尾可以直接得到当前段的最值。下标 i 在前,j 在后,用 i 指示当前的数组元素nums[i],并且与两个队列的队尾比较。如果小于q1的队尾,那么他是最小的,需要把前面的元素排干净,让nums[i] 成为q1 的队首。如果大于q1队尾,直接入队构成单调递增序列。如果大于q2 的队尾,class Solution {public: int longestSubarray(vect原创 2020-11-15 16:35:45 · 137 阅读 · 0 评论 -
LeetCode 120. 三角形最小路径和
浮生日记__今天是周日,我好想下去踢球,但是天气不太妙。也是不想学习的一下午,写点博客。正文原题链接题目是很经典的一道动态规划题目,具体思路是借鉴的B站这位小姐姐的从下往上的分析思路。一开始自己做的时候,用的是一般的贪心算法,卡在了[[-1],[2,3],[1,-1,3]]的用例上,行不通的原因就不做过多解释了。给出C++代码:class Solution {public: int minimumTotal(vector<vector<int>>&原创 2020-11-01 14:45:09 · 132 阅读 · 0 评论 -
LeetCode 02.08. 环路检测
原题链接原本以为可以用链表的一般操作解决,试了好多都不行,能想到的基本复杂度比较高。题目评论中最好的答案就是快慢指针的方法,但是描述的都不够清楚,看B站老哥的视频茅厕顿开。继续努力,我们都有光明的未来!贴出代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL)原创 2020-10-25 13:53:32 · 88 阅读 · 0 评论 -
LeetCode 1171. 从链表中删去总和值为零的连续节点
浮生日记__今天是状态很差的一天,这几天的睡眠一直不好,对床的哥们半夜把电脑拿上床玩,一直开着最亮的屏幕,反光在墙上太刺眼了,搞得我睡不着,哎,不想去说他,不值当的。白天在图书馆困的和狗一样,不停地打哈欠,中午想着回去美美的睡个午觉,好不容易睡着了,又被回来的老哥吵醒了。__最令我烦的是,寝室里一哥们保研了,每天看似舒服得一批,咱也没啥兴趣去问人家每天干啥。高傲的不行,是之前另一个寝室里搬来的,原因是和同学有矛盾。来了我们寝室之后,感觉还不错,处得来。日久见人心,时间长了之后,该暴露的就都暴露出来了。原创 2020-10-25 10:17:39 · 142 阅读 · 0 评论 -
LeetCode 面试题 02.05. 链表求和
浮生日记__今天是周末的图书馆,前些天踢了球,累的要死,按照惯例写两道LeetCode放松一下。心情有点糟糕,旁边一个哥们体味好重,周围的妹子也没有昨天的多。有时候感觉自己的博客写的很枯燥,想搞一点趣味性的东西,以后就在博客开头写一点自己遇到的有趣的事情吧,尽量控制字数。__先写的下面的内容,返回来写这一段的时候,周围为数不多的几个妹子因为难忍的味道陆续离开了。这个哥们怎么这么不自觉,知道自己邋遢就不要来图书馆祸害别人了好不好,好烦啊,其他地方也没有一个合适的插座呐。__有点烦躁,下回再写。正文:原创 2020-10-11 15:36:26 · 99 阅读 · 0 评论 -
LeetCode 24. 两两交换链表中的节点
原题链接本题两种思路,递归和非递归我使用的是递归结构,运行的结果很惨,时间和内存都是5%。思路比较简单递归思路:从前往后处理链表,声明指针 ListNode *p,*q,p在前,q在后;将p和q的位置互换;p要先指向q->next,q后面的节点递归处理;递归推出条件为链表中少于两个节点;给出代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNod原创 2020-10-04 20:20:15 · 70 阅读 · 0 评论 -
LeetCode 969 煎饼排序
原题链接不断翻转数组的前面的几个元素达到排序的效果。思路:每次找到没有被交换到数组首位的最小值元素,并将包括该元素之前的所有元素翻转;在数组中寻找到下一个最小值元素,并将不包括该最小值元素之前的所有元素翻转,那么最小值和次最小值放在了一起;重复步骤1 ;途中利用下表index记录翻转的长度;该思路宗有一些稍微的冗余,比如,当第一步完成后,次小值与最小值已经在一块了,就没有必要进行下一步翻转,应当跳过一次。如果想在结果数组中优化,就去掉数组中挨在一块的相同的元素的一个;否则需要添加判断条件;原创 2020-09-27 16:38:45 · 89 阅读 · 0 评论 -
LeetCode 147 对链表进行插入
原题链接对单向链表使用插入排序算法。思想如下:由于单向链表只能朝着一个方向遍历,因此设置当前节点current的前序节点pre。比较过程中也需要设置两个节点,compare和它的前序节点precompare。设置一个头节点head的前驱节点。用来设置被放在首位的节点。交换节点时,先连接后断开。单独考虑current节点不动的情况,此时的pre要向后移动一个元素,current也要移动一个元素。数组形式的插入排序是从后往前比较,由于链表是单向的,选择从前往后比较。给出自己丑陋的代码/*原创 2020-09-13 19:13:42 · 74 阅读 · 0 评论 -
LeetCode 面试题 17.21 直方图的水量
原题链接使用的是双指针的方法。题目思路:限制某个区域水量的是这个区域的最高的两个边;过程中需要记录左右两边碰到的最大值,分别记为maxLeft和maxRight;当height[left]小于等于height[right],说明不管left和right中间有多高的柱子,在当前柱子上注水起码可以不用考虑因为右边短而不能注水;继续考虑height[left]和maxLeft的关系。如果maxLeft大,证明maxLeft可以作为该柱子的边界,该柱子之上可以注水;如果maxLeft小,不能注水,更新m原创 2020-09-13 15:14:06 · 152 阅读 · 0 评论 -
PAT甲级 1002 A+B for Polynomials
原题链接先说说这道题学到了什么。map库的使用。键-值对的使用,使得成对存在处理的数据变得方便。如果为基本数据类型,map一般key-value默认为 0,‘\0’。map会根据insert进去的键-值对按照键从小到大默认排序,为的是方便搜索。如果想要从大到小进行遍历,则可以对map使用倒序迭代器:reverse_iterator本题是对相同指数的系数相加,指数作为key,系数作为value,在对相同键操作的时候可以直接在一个map上按照以下形式处理。map[key] +=value;本原创 2020-08-23 15:27:01 · 97 阅读 · 0 评论 -
PAT甲级1001 A+B Format
今天开始刷PAT练习数据结构的基础。原题链接这道题的思路很清晰。即便是题目给出了数字范围,为了避免int类型(32位)溢出的可能,把位数扩展至long int(64)的长度。先将两数相加取绝对值,赋值给变量 addT;如果 addT=0,返回字符串“0”;while循环逐步取 addT 的最后一个数(取模),存入字符串 relust;对 addT 除以10 抛弃最后一个数字,并赋值给自己;计数器 count 每 3 次添一个逗号;添完后归零重新计数;退出循环再考虑符号问题;给出代码:#原创 2020-08-02 22:28:23 · 149 阅读 · 1 评论 -
快速排序_C++实现
#include <iostream>using namespace std;/* #与归并排序一样,快速排序也使用了分治思想。 #快速排序分三步分治: 分解、解决、合并*/void QuickSort(int *A, int left, int right);int Partition(int *A, int left, int right);void sw...原创 2020-02-12 22:54:27 · 269 阅读 · 0 评论 -
堆排序_C++实现
#include <iostream>using namespace std;/*堆排序优势:(二叉堆) 计算机内部: LEFT: i值左移一位,计算出2i; RIGHT:i值左移一位,低位加一,计算出2i+1; PARENT: i/2取下界; #最大堆性质:除了根节点以外的所有节点i都要满足: A[PARENT(i)]≥A[i] 堆中的最大元素在根节点,堆...原创 2020-02-11 18:20:43 · 143 阅读 · 0 评论 -
寻找最大子数组递归_C++实现
求解数组中的最大子数组问题:分治递归 思想: 把数组分为左右两部分,下标为:left,mid,right,最终的最大子数组的存在形式无非有三种: *存在于left-mid之间; *存在于mid两边; *存在于mid-right之间; 递归问题特征: *问题解所在的域情况可数; *同级子问题之间相互独立; *同级子问题结果作为上一级问题参数; *问题边界有确...原创 2019-12-28 09:33:55 · 219 阅读 · 0 评论 -
归并排序_C++实现
分治法思想: * 一次或多次调用自身解决紧密相关的若干子问题 * 将原问题分解为几个规模较小的类似于原问题的子问题递归求解 * 结合子问题建立原问题的解分治模式步骤: * 分解 * 解决 * 合并归并排序完全遵循分治模式: * 分解:分解待排序的n个元素的序列成 n/2 个元素的两个子序列 * 解决:使用归并排序递归排序两个子序列 * 合并:合并两个已排序的子序列以产生已...原创 2019-12-25 18:54:09 · 99 阅读 · 0 评论 -
插入排序_C++实现
#include <iostream>using namespace std;//插入排序函数int* insert_Sort(int A[],int num);//重载输出函数,使得 “<<” 能够输出数组ostream &operator <<(ostream &os, int* A);int main(){ int a...原创 2019-12-25 15:05:29 · 173 阅读 · 0 评论