即时学习
算法这方面完全没学过,和别人比差好多,从现在开始学习吧,和小齐一起齐步走!!
戴子钧
这个作者很懒,什么都没留下…
展开
-
CS人的痛
选取一些学习的,求上岸。原创 2023-08-01 10:00:08 · 106 阅读 · 0 评论 -
动态规划V (85、91、97)-最近都开始摆烂
题目描述:给定一个仅包含0和1、大小为的二维二进制矩阵,找出只包含1的最大矩形,并返回其面积。学习记录:对每一个地方都去统计最大举行的话,会有很多多余的计算,题解思路很好理解。先统计每个位置最左边有多少个连续的1,然后在遍历数组,以每个位置为右下角寻找即可。原创 2023-06-23 22:05:59 · 181 阅读 · 0 评论 -
动态规划IV (118、119、198、213、337)
题目描述:给定一个非负整数 numRows生成「杨辉三角」的前 numRows行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。学习记录:思想就是没有思想,的杨辉三角,但是注意resize的用法和初始化的方法!原创 2023-06-16 22:53:27 · 1031 阅读 · 0 评论 -
动态规划III (买股票-121、122、123、188、309)
题目描述:给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0。学习记录:第一想法是双指针往中间走,但是存在问题,就是取到最大最小的地方我们不知道,无法判断指针的移动,这种方法不可行。原创 2023-06-09 21:23:37 · 422 阅读 · 0 评论 -
动态规划II (42、53、64、70、72)
题目描述:学习记录:虽然脑子里第一个蹦出双指针,但是题目是动态规划,两个混着想,啥也没想出来...不会1.动态规划:太牛了吧,这个不是从整体去考虑每一块该怎么填,而是通过判断每一个位置上的雨水的量进行判断的2.双指针:和动态规划思想一样,就是省去了两个数组,并且也不需要两边的最大距离,只需要在这个地方能存储的最大即可。原创 2023-06-09 20:34:32 · 599 阅读 · 0 评论 -
动态规划I (45、55、62、63)
按顺序刷确实效率太低了,今天开始要按顺序的同时也按标题来了,全面加油!这种应该以后会更多直接总结题解了,自我学习用,全靠大佬,贴贴!!原创 2023-06-08 20:47:28 · 683 阅读 · 0 评论 -
(不会)CP30 串联所有单词的子串
想法是之前做过的两道题的结合,先返回数组的所有串联子串,然后将所有子串当作模式串,采用模式匹配,找到在主串中的位置。但是看起来就是时间应该不会短,但是肯定能做。直接上题解,滑动窗口的思想...但是没看懂,先放这里,回来再写把...原创 2023-06-08 19:18:34 · 39 阅读 · 0 评论 -
CP28 找出字符串中第一个匹配项下标 & CP29 两数相除
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1。数据结构上学过,去复习,不多说。原创 2023-06-03 08:57:33 · 26 阅读 · 0 评论 -
CP27 移除元素
然后上述方法是可以的,但是存在很多不需要的操作。我们把5放在位置1上,又把6放在位置2上,但不考虑顺序,最简操作显然是将6放在位置1上。所以可以采用双指针的优化,定义左右指针,左指针存放下一个要存的地方,右指针找下一个要存的元素,左右重合就是结束。给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。看了题解方法一双指针,思路一样,但是突然发现result和index是同步变化的呀,可以删去一个,虽然设想的用法不同,但实际是一样的。原创 2023-06-01 10:20:27 · 38 阅读 · 0 评论 -
CP26 删除有序数组中的重复项
思考可知,我们需要历遍数组来判断,用三个变量,result,index,value。result统计有几个不同的值,由于是升序数组,只需要看和上次的一不一样就行,如果不一样就++。index用来记录下一次存储的位置,由于数组历遍后就不再需要了,而且根据题目描述不需要考虑多余的部分,因此只需要在和上次不同的时候覆盖存储就行了。简单题就是要一遍过!题解使用的是双指针,然后没有额外记录,其实和原思路中i和index的用法是一样的。但是他没有额外记录value的内容,也就是说,我们的方法是可以修改的,修改如上。原创 2023-06-01 10:01:48 · 38 阅读 · 0 评论 -
CP25 K 个一组翻转链表
给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。刚刚做完两个节点的,就想着用类似的方法来处理这道题,先判断是否后面还有k个节点,没有则返回当前头,有则翻转该k个。感觉还是很简单,但写的时候思路有点混乱,参考题解。题解代码如下,看完其实豁然开朗。然后就是这里讲了如何返回两个值,用pair即可。原创 2023-06-01 09:38:22 · 32 阅读 · 0 评论 -
CP24 两两交换链表中的节点
想法就是依次记录三个指针a,b,c表示上一个节点、交换节点1,交换节点2;通过指针的操作交换位置,然后依次往后进行。这里想完后看了一下题解,应该是没问题的,可以实现,就去写了,代码如下,一遍过!给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。2.head在交换后是改变位置了的,需要head=save->next,找到新的头。1.第一次交换情况和别的不同,因为没有前驱,但可以。了,能够将问题一般化,要学会使用。原创 2023-06-01 09:07:38 · 27 阅读 · 0 评论 -
CP23 合并K个升序链表
为什么执行这么慢,因为对空指针其实是重复判断的,有一个方法是,当空指针后就将指针移出vector, 但我记得之前做删除的时候vector其实还是存在问题,这里就没有这样,但是如果做了可能会提升执行速度。思路:这个方法和前两种方法的思路有所不同,我们需要维护当前每个链表没有被合并的元素的最前面一个,k 个链表就最多有 k 个满足这样条件的元素,每次在这些元素里面选取 val 属性最小的元素合并到答案中。想不到更好的方法了,写了一下,是OK的,但用时还是很长的。思路:考虑优化方法一,用分治的方法进行合并。原创 2023-05-30 12:04:38 · 56 阅读 · 0 评论 -
CP22 括号生成
看到的第一想法是,用递归和回溯,就和那个电话号码题差不多,但苦鲁西,但是我写不出来鸭!代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且。题解是暴力法、回溯法、按括号长度递归法,emmm,都看不懂。其实这两种思路都是差不多的,但是都很清晰,我简直依托答辩。看看dl,提升自己,原创 2023-05-29 20:15:09 · 37 阅读 · 0 评论 -
CP21 合并两个有序链表
数据结构上学过的想法,直接定abc三个指针移动,不用开辟新的空间,一遍过。新链表是通过拼接给定的两个链表的所有节点组成的。答案使用的递归的方法,也是非常巧妙的。将两个升序链表合并为一个新的。原创 2023-05-29 14:17:38 · 29 阅读 · 0 评论 -
CP20 有效的括号
最开始的想法就是,定义三个计数的变量a,b,c,分别记录(),{},[],的个数,左加右减,过程中不小于0,最后等于0是正确的。但是存在一种情况 ( [ ) ] 这种情况在我的方法中会返回正确,但是显然这个应该是不正确的,因此wrong!题解里给出的代码用到了unordered_map,leetcode是真的喜欢用,也是真的方便,粘上来学习一下。给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。题解:栈的方法,栈与含括号是的方式是完全一样的!原创 2023-05-29 10:39:36 · 38 阅读 · 0 评论 -
CP19 删除链表的倒数第N个节点
最简单的就是两次循环便利链表,第一次找到长度,第二次进行删除,是OK的,主要是注意一下条件那里,最开始是认为length==1 return nullptr;但是在return前加入delele所有自定义的指针后,发现执行出错,因为这些指针指的是链表里的元素,再和题解中的进行对比,题解中的delete的指针是new出来的,直接定义没有开辟新空间的指针是不需要delete的,C++已经全忘完了,该去复习复习了。也是一种很巧妙的思想,不需要知道总长度,给你一个链表,删除链表的倒数第。原创 2023-05-29 10:11:17 · 29 阅读 · 0 评论 -
CP18 四数之和
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):0原创 2023-05-29 09:03:30 · 73 阅读 · 0 评论 -
※CP17 电话号码的字母组合(递归+回溯,不会)
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。最简单的想法就是每一位往后加,但总觉得不是很对劲,看了题解,还是太菜了,复制题解学习一下吧。原创 2023-05-29 08:58:36 · 31 阅读 · 0 评论 -
CP16 最接近的三数之和
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。假定每组输入只存在恰好一个解。1.初始化result不能是0,因为如果0和target比结果更接近就是存在问题的。想到CP15是用双指针,这里是不是也可以捏。2.j和k的变化借助变量比++更方便。原创 2023-05-23 16:49:20 · 29 阅读 · 0 评论 -
CP14 最长公共前缀
正确使用截子串:s.substr(n,length)//表示从字符串n的位置开始截取length长度的字符。编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串。原创 2023-05-23 12:03:05 · 49 阅读 · 0 评论 -
CP13 罗马数字转整数
理论上我会逐位判断,然后加加,懒得写,复制题解,题解好简单,看来要学会用map。原创 2023-05-23 12:02:02 · 82 阅读 · 0 评论 -
CP12 整数转罗马数字
好像之前做过,简单复制一下。原创 2023-05-23 10:59:07 · 30 阅读 · 0 评论 -
CP15 三数之和
做完11题过来的,选了个双指针想练练,发现是一点都不会i,因为要求没有重复,所以思索用unordered_set进行查找,但是这样的问题是,重复的元素并不能直接去掉,因为比如-1+-1+2=0我们是需要使用的,需要两个循环,也用不了双指针...还是去学习一下吧。的代码,自学一下,首先排序可以采用自带方案sort函数,然后要注意边界值的情况,比如空的时候返回的问题,然后注意一点在循环中判断左右指针移动的时候,我是这样的,然后就报--时间超时,可以看到这个uu用tem[]记录后判断会减少很多访问,就可以通过!原创 2023-05-23 12:03:16 · 27 阅读 · 0 评论 -
CP11 盛最多水的容器
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。拿到题,在想是不是动态规划,选这个的情况和不选这个回退到上一步的,但是回退后只知道盛水最大,但不知道是哪个边界,所以应该是有问题的。想想简单的或许双循环?哎,只会这种最笨的,试试吧,试了超时了,偷偷看了眼评论应该用双指针来做。若指向同一数组,但是遍历方向相反,则可用来进行搜索,例如在本题中,如果我们都从左向右,那么其实收缩条件是很难的,最终感觉还是会变成历遍,采用反向移!若两个指针指向同一数组,遍历方向相同且不会相交,也成为滑动窗口。原创 2023-05-13 11:13:44 · 29 阅读 · 0 评论 -
CP10 正则表达式匹配
如果逐位判断,'.'视作相同,'*'要看上一位的,如果上一位是'.'视作相同,是别的字符在进行判断。写完后发现,'*'是匹配零个或多个,不是一个或多个,我真的哭死,难绷,然后修改错误百出,需要考虑的情况也是非常多的。给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。所谓匹配,是要涵盖整个字符串 s的,而不是部分字符串。,太菜,去看了题解,是采用的动态规划的方法(我算法是真的菜👎)然后,还在CSDN上参考了这个uu的文章,是用的递归的思想。原创 2023-05-13 11:13:28 · 173 阅读 · 0 评论 -
CP9 回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true;否则,返回 false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。注:考虑符号,-121不是回文。你能不将整数转为字符串来解决这个问题吗?”思考.jpg,result=result*10+x/10;x=x/10这种,看了题解,好吧,确实,就不写了。但是官方还是聪明的,简单方案,to_string哈哈哈哈哈,就没写。原创 2023-05-11 17:59:23 · 22 阅读 · 0 评论 -
CP8 字符串转换整数
4. 边界条件"2147483646" "-2147483648"应该格外考虑,int所能表示的范围是-2147483648到2147483647,因此对于负数,我们不能先*10+t在考虑正负号,边界条件要注意。写完去看了题解,救命死去的回忆在攻击我,很惭愧的说,编译是一门大学中我考的最高的一门,但是也是所有大专业课中最不会的一门,不想看,先复制一下题解,回来再说...2. "00000-42a1234"应该是0,而且-+应在第一个字母出现之前。1. "+-12"没有考虑两次出现,应设置次数限制。原创 2023-05-11 17:45:29 · 38 阅读 · 0 评论 -
CP7 整数反转
我的一个想法是,将int转为string,然后对string反转,代码如下,但是存在一个问题是溢出...例如下面这个数,反转后已经超过处理位数了,出错...官方给的题解好简单,一眼懂。原创 2023-05-11 16:48:47 · 70 阅读 · 0 评论 -
CP6 N字型变换
N字形变换后每一行可以看作是一个字符串,最后将字符串加起来输出就行。定义一个有numRows个字符串的数组,那问题就在对于字符串s的每一个字符加到数组的哪一个后面,由于N字形,如果4行,那加的顺序就是1234 32 1234 ....在过程中如果超出s的长度就退出就行了。,以从上往下、从左到右进行 Z 字形排列。2.压缩矩阵(其实和用字符串是一样的,用可变数组向后添加).题目描述:将一个给定字符串。1.矩阵存储(计算需要几列)原创 2023-05-11 15:51:56 · 33 阅读 · 0 评论 -
CP5 最长回文子串
我们用 P(i,j)P(i,j) 表示字符串s的第i到j个字母组成的串(下文表示成 s[i:j]s[i:j])是否为回文串:如果是回文P[i,j]=1,否则P[i,j]=0。边界i和j不能越界,P[i,i]=1,P[i,i+1]=s[i]==s[i+1]。想要求解一个动态规划,我们必须定义变量,求递推关系,找边界条件。看完感觉自己都会了,按照这个思路还是有错,还是要实际动手。作为一个小白,还是只会暴力破解法,先写写试试,通过。原创 2023-05-11 15:17:32 · 56 阅读 · 0 评论 -
CP4 寻找两个正序数组的中位数
思想是,奇数k=(m+n)/2,偶数k=(m+n)/2或(m+n)/2+1,我们就是要找到可以转化成寻找两个有序数组中的第 k小的数,由于两个数组是均是有序的,我们只需要比较A[k/2-1]B[k/2-1],可以将k值缩减一半。最初的想法是,将两个数组合为一个数组,采用两个下标分别移动的方式,又想省空间,觉得不如只移动不开新的数组,然后用一个计数器,结果就是情况很多就一直报错。标签是困难,看完题感觉还行呀,写的时候才发现难点所在,情况非常的多,因为数组长度可能为0,那么就需要很多的判断,需要理清思路。原创 2023-05-11 15:16:45 · 28 阅读 · 0 评论 -
CP3 无重复字符的最长子串
例如abcdcefghi,当左指针在a有指针在第二个c处,判断有重,会将左指针所只的a移出,依然有重,则b移出,c移出,后没有重复则可将右指针的加入,以此实现滑动窗口。评论1:答案有个缺点,左指针并不需要依次递增,即多了很多无谓的循环。评论2:标准答案步骤稍多,而且不容易理解,应该左侧指针固定,移动右侧指针,当窗口内最右侧的字符在set中存在时,左侧指针移动并从set中移除原左侧指针对应的字符,这样再取窗口长度的最大值即可。答案给的题解也差不多,用滑动窗口来做的,结合两个指针,其实和我的也差不多(或许。原创 2023-05-11 15:16:31 · 28 阅读 · 0 评论 -
CP2 两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。我的题解,但是看起来还是复杂的,复制一个官方题解供参考。原创 2023-05-11 15:16:14 · 53 阅读 · 0 评论 -
CP1 两数之和
这样我们创建一个哈希表,对于每一个 x,我们首先查询哈希表中是否存在 target - x,然后将 x 插入到哈希表中,即可保证不会让 x 和自己匹配。unordered_map存储元素时是没有顺序的,只是根据key的哈希值,将元素存在指定位置,所以根据key查找单个value时非常高效,平均可以在常数时间内完成。的实现其实是一个结构体,既然是将两个数据组合成一个数据,find函数返回为容器位置,用auto接收,与容器.end()进行判断。文章非原创,从各处搜集的资料,自留学习用,不妥删。原创 2023-05-11 09:21:37 · 35 阅读 · 0 评论