赞
踩
以下为代码随想录算法训练营优质讨论内容
代码随想录算法训练营
以下为代码随想录算法训练营优质讨论内容
刷题建议
●代码随想录目前有前半部分都有视频讲解,一定要先看视频,事半功倍。
●一定要了解自己做题用的语言,或者说,原本可能不熟,但在做题过程中,碰到一些语法问题、容器选择问题等等,就随时地百度、google一下,这样刷题一圈下来,对语言的掌握程度也能提高不少
●几乎所有的代码问题都可以通过打日志来解决,哪里不懂打哪里的日志。
●如果对递归不是很熟悉, 就主要先学一下思想, 设计简单case, 进入到递归的最后一层然后执行逻辑慢慢倒着推一遍就可以知道逻辑了, 以后才可以正着就写出, 部分题目递归的本质是把每个问题都分成子问题, 子问题都解决了就等于解决了主问题。有点大家后面学的动态规划的意思。学树的时候大家就更能有这个感受了不着急哈 From 芒果冰冰
●遇到奇怪bug无法解决的时候卡哥建议:很多录友刷题的时候 也会有这样的问题,就是 好不容易代码写出来了,怎么改都不对,又不舍得删自己的代码,然后怎么看也看不出问题。 我也遇到过这种情况,我的经验是,代码全删连备份都不要, 重新写。
●多考虑一下自己代码的鲁棒性,进入循环用到之前之后都打一下日志啥的,是很好的一个发现错误的方法!
●有的录友会因为各种各样的事情没跟上进度,时间紧张的录友 可以只把题目AC,博客简单记录思路也可以,甚至是 只把题解看一遍 了解一下思路也可以,但一定要跟上进度,这样才有节奏,如果 大家每日任务落下了 就会一直落下了,很难再追上,然后 自己进度就越来越慢,更不上节奏,成为群里的旁观者。 所以 大家 每道题目 理解的深度上可以做 剪枝,哪怕是今天没时间了,就把今天安排题目的题解读一遍,了解一下整体思想,看看大家讨论内容,这样也是跟上了,周日自己在抓紧时间补代码练习。训练营结束至少也对各个专题的算法解法有一个大体了解。 总比落下进度,自己也不追了,成为群中旁观者 强得多。
● “KMP算法 和 day10 安排的题目(kmp的一个应用),一刷 录友们 可以适当放过,或者了解一下 算法原理就行,毕竟比较难,等二刷的时候在重点啃
●坤哥路线分享:第一次刷的时候,可以先根据Carl哥的题解走一遍,熟悉题型,二刷的时候开始个人归纳总结,然后找类似题目多练练,得出个人的题型模板,在后面就偶尔打打周赛,做到灵活应用。建议大家也可以参加一下周赛
如何Debug???(有问题会继续更新)
debug的思维很重要,如果没有这种思考方式,下次 遇到 代码问题,依然还是不会,不能靠自己解决问题。 这是 鱼和渔的关系
最近发现很多录友还是不太会debug不能靠自己找出代码的问题故写一下方法
说明 : 如果你打了以下日志还是没找出问题,则可以利用idea或者其他编辑器自带的断点和debug工具调试,当然可以细化debug的粒度,记住核心是先定位问题的行数,出现的轮次,在那个轮次当中进行检查
一个排查问题的思路,你的报错 一大串 你也分不清是哪里出错了,这种情况下,你把你的函数一个一个的删(当然之前可以先备份一下),删到哪个函数,没报错了,再去填新的函数,不要 整段代码一起看。
例子1
例子二
例子三
例子四
例子五
关于看题解
很多同学总是因为自己没有办法一次性把题目A出来而感到沮丧,并且会为了自己需要去看答案而感到自己很菜
我想说的是:一刷不要耻于去看答案或题解,毕竟学习谁也不是生来就会,除非你是天才,保证自己二刷三刷可以不看就有思路或者直接写出来,就是自己最大的进步,刷题也是一种学习的过程,需要循序渐进。
如果一道题你二十分钟没思路,或者说你写出来了但是debug了几十分钟,不要犹豫,直接打开卡哥的代码随想录,直接看思路,或者直接对照代码一行行检查,往往是最高效的排错过程
一般来说出现bug的地方也只是一些微小的细节,注意得多了自然以后经验丰富了bug率自然也会降低的。
蓝桥杯怎么准备?
●刷力扣刷蓝桥杯真题,达到可以力扣周赛1900的水平就差不多能拿个省一吧,蓝桥杯主要就是暴力法,也就是dfs,bfs,回溯比较重要,其他的都是暴力做就好了满分除了签到起码要ICPC铜牌实力了现在,多总结题型多刷题,当然你现在还是先把代码随想录过一两遍,这是以后做题的思路基础
●主要还是建议做真题吧,B组的话就时间换算那些还是必须要会的暴力能拿的拿到,A组的题就比较难,除了签到基本上都是暴力拿满,只要有一道能想到个接近满分的次优解就能省一,OI赛制按最后提交的答案算分如果%90能拿30分,%10能拿50分就选%90的,能想出最优解的话起码蓝桥真题得做不少
●蓝桥杯几个重点: BFS,DFS,回溯,递归,二分, dp(没事大家一般都做不出来这个) B组加一个时间转换,进制转换 这些是最重要的(暴力还得回溯DFS呢对吧,二分稍微优化一下得分就更高)
字符串哈希解决不会KMP的小伙伴的烦恼
字符串哈希博客
排序算法(重点掌握归并快排堆排)
排序算法详解(堆,归并,快速排序最简及理解写法; 芒果冰的bolg)
十大排序从入门到入赘
十大排序算法超全大综合,动图演示,你真的值得拥有!
工具分享
●Excalidraw | Hand-drawn look & feel • Collaborative • Secure
大家平时刷题可以用这个网站画草稿图帮助理解!如果看题解很蒙或者思路不清晰的时候,跟着程序处理流程画一个图,90%的情况下都可以解决问题!
●Data Structure Visualization
数据结构和算法可视化可以看这个网站,还可以互动添加元素等,非常直观让你快速理解!
●Deque (Java Platform SE 8 )
这是Java的Deque容器的官方文档,这个容器非常重要,作为Java选手一定要牢牢掌握。他是一个双端队列,常用来当栈和队列使用,api也是非常丰富,刷题过程中出现频率很高!之后就是关于看文档的问题,大家遇到api不清楚的情况下第一时间要学会去看官方文档,这是第一手资料,往往是最准确的,包括大家之后工作中遇到问题也要养成这种能力,还有阅读英文文档的能力。
●如何将力扣上面的题目拉到idea里跑?
有第三方插件可以安装: Leetcode editor
●力扣插件:
ahttps://github.com/zhang-wangz/LeetCodeRating 可以显示题目难度对应的leetcode周赛难度分(如果这道题曾经在周赛中出现过)
bhttps://github.com/XYShaoKang/refined-leetcode 可以帮助记录做题时间,打开做题页面就会开始计时,这样可以帮助大家知道解出这题花费了多久,也可以更合理地安排时间
day1
讨论知识点
●最重要的就是分类讨论好二分,二分看着好写边界case还是需要测试的哈
●大家需要注意二分的几种情况
○当l = 0, r = n的时候因为r这个值我们在数组中无法取到,while(l < r) 是正确写法
○当l = 0, r = n - 1的时候因为r这个值我们在数组中可以取到,while(l <= r) 是正确写法 主要看能不能取到这个值
●二分法有多种写法,末尾是开区间闭区间都可以解出寻找单个元素和寻找边界的题目,只需要注意相应的是l < r还是l <= r,每次取mid还是取mid加减一即可。建议理解后背熟一套模板,不要搞混。
●关于二分法和移除元素的共性思考
关于二分法和移除元素的共性思考这两题之间有点类似的,他们都是在不断缩小 left 和 right 之间的距离,每次需要判断的都是 left 和 right 之间的数是否满足特定条件。对于「移除元素」这个写法本质上还可以理解为,我们拿 right 的元素也就是右边的元素,去填补 left 元素也就是左边的元素的坑,坑就是 left 从左到右遍历过程中遇到的需要删除的数,因为题目最后说超过数组长度的右边的数可以不用理,所以其实我们的视角是以 left 为主,这样想可能更直观一点。用填补的思想的话可能会修改元素相对位置,这个也是题目所允许的。
●其实二分还有很多应用场景,有着许多变体,比如说查找第一个大于target的元素或者第一个满足条件的元素,都是一样的,根据是否满足题目的条件来缩小答案所在的区间,这个就是二分的本质。另外需要注意,二分的使用前提:有序数组
●小tips:
○根据题目的数据量范围选择合适的算法,比如数据量是10^5,那就只能使用O(nlogn)复杂度以下的算法了,使用O(n^2)是会超时的;而如果数据量只有100或者1000,则可以果断的采用暴力方法(一般是O(n^2))进行求解
○二分的最大优势是在于其时间复杂度是O(logn),因此看到有序数组都要第一时间反问自己是否可以使用二分。
今日打卡的博客分享
算法记录 | Day1数组基础给出难点思考过程和总结过程python代码,也有了自己的收获
Java数组笔记及算法练习多了一些拓展的题目,和自己的思考,大家也可以做一下Java
代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素给出写法思考和复杂度以及自己的收获c++
比较简单,算上博客大概2-3h,网速不行... 将思考过程完全体现了出来,重点突出,总结和注意点很到位
找一找刷题的感觉 多种方法都尝试了,加油加油
二分查找+移除元素 注释很详细,排版上还可以优化
很细,注释很全,看不懂算我输(求推荐) 这位录友的格式很不错~对于时间复杂度的分析很到位,值得大家学习
没被分享的小伙伴也不要灰心,可能不是你写的不好只不过可能我偶尔会犯傻一两下哈哈,希望大家理解一下,坚持打卡写上收获思考总结,一定可以进步的! 芒果冰冰也是刷了几个月总结才形成自己体系进步的大家也可以!
day2
讨论知识点
●滑动窗口:本质是满足了单调性,即左右指针只会往一个方向走且不会回头。收缩的本质即去掉不再需要的元素。也就是做题我们可以先固定移动右指针,判断条件是否可以收缩左指针算范围。大家可以好好理解一下。From 芒果冰
●为了特殊情况的专门写判断语句效用有多少?是否需要考虑特殊的情况?
需要考虑特殊情况,比如容器/数组/指针是否为空等,可以在考虑到特殊情况后先额外判断写出来,整体逻辑写完后看是否能和一般情况进行合并
今日打卡的博客分享
【代码随想录Day2】有序数组平方+最小子数组+螺旋矩阵II这个录友写的很不错哦, 螺旋矩阵还进行了可视化
Day2 数组:977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵Ⅱ小伙伴的分析画图很不错,滑动窗口的解题关键总结,排版也不错 c++
【刷题笔记day2】左右指针、滑动窗口、模拟分析了复杂度,重点是拓展了很多题目给大家可以去尝试做一下 python
反证法证明, 抓住定义的意义,不惧Corner case, 抓住循环不变量 | 代码随想录算法训练营第2天| 977. 有序数组的平方、209. 长度最小的子数组、59. 螺旋矩阵 - ywh-pku - 博客园 这位录友还用了反证法进行了证明「有序数组的平方」,大家可以看看他的博客应该会很有收获,非常优秀的一位录友。
虽然这些题之前做过,但是没有真正掌握,这次连自己写及看视频、文字讲解将近4个小时,写博客花了2个小时左右 很认真很用心,大家相互学习,加油鸭
代码注释非常详细,提供螺旋矩阵不同于代码随想录上的方法,非常容易理解 这位录友依旧用心~数组的总结也不错,值得学习~
day3
讨论知识点
●注意点:指针问题, 大家今天写删除链表题的时候经常少了else判断, 链表首要想好指针是怎么移动的,是否会移动会访问null即可
●
●大家遇到问题的时候对于链表问题可以多用笔画画图,这样会加深你对指针和节点实体的理解,代码的鲁棒性如何通常可以利用边界case尝试,今天很多人都是因为空指针的错误其实大多是一些if,while中不小心取到了空和循环次数和条件有关这种可以设计简单case比如1-2-3-null这种手动画图走一遍自己的代码就解决了。
●大家平常遇到不会的问题可以自己先用输出语句debug一下力扣是支持的哦,遇到问题一般自己先输出debug,解决不了设计简单case手动debug(一定要是简单case,因为手动理解深但是麻烦),再解决不了群里问别人这样是比较好的,debug也是我们写算法的一个能力,这个能力和边界case的思维对大家的工作也会有一些帮助。
●链表一定要分清节点和指针的概念 new ListNode()是真实存在的一个节点, head = new ListNode() 相当于 head指针指向了一个真实的节点, node = head, 相当于node和head同时指向了这个真实的节点
●链表相交的节点为啥不是数值相等的节点而是指针相等的节点?
首先不要把值和节点的概念混淆起来,节点是一个实例,占用一块空间;值只是它的成员变量。
值怎样和节点本身没有任何关系 一个实例只由它的地址唯一确定。
就像一个数组的两个位置,它们里面可以数值相同,但是并不是同一个地址。
或者说,本来就不是比较节点相不相等,而是比较这两个指针是否指向同一个地方。
●大家尽量不要去动虚拟头节点,因为虚拟头节点本来就是个工具节点,操作后面的节点本身就好了哦
●大家空针异常优先看上面debug的方法,节点前debug判断一下是否为null来定位!
●while复杂度分析主要看内部总共执行多少次,不是看跟for嵌套就成了On2,滑动窗口就是On
●加入滑动窗口中有负数怎么办?
如果有负数的话感觉也不能用滑动窗口了,因为有负数的话无论你收缩还是扩张窗口,你里面的值的总和都可能增加或减少,就不像之前收缩一定变小,扩张一定变大,一切就变得不可控了。如果要 cover 所有的情况,那每次 left 都要缩到 right,那就退化为暴力了哈哈。
● 寻找链表相交节点的题,python解法中提到了一种两个指针分别依次走两个链表的思路,其本质上是链表拼接,详情可以参考题解
● 涉及到修改字符串的O(1)算法理论上是只对字符串可以修改的编程语言成立的(如C++),对于其他编程语言通常参数会给成字符数组的形式
今日打卡博客分享
代码随想录第三天 || 链表理论基础 || 203.移除链表元素 || 707.设计链表 || 206.反转链表链表理论基础和题目的思路解析分析都很到位,也有总结收获,对自己以后解题的思考Java 小建议:代码风格可以改进一下比如赋值不要写val=1等号两边可以加空格还是有必要的哈
代码随想录算法训练营第三天 | 203.移除链表元素、707.设计链表、206.反转链表很不错的一个博客,内含链表总结!!!
窗外日光弹指过,席间花影坐前移 笔记很完整,全手写笔记,对链表的变化过程画图描述,很清晰。链表墙裂推荐画图!另外标题很诗意~
第三天 | 203.移除链表元素、707.设计链表、206.反转链表 递归迭代法分析很到位,笔记风格美观
【代码随想录 | day03】(JavaScript)链表理论基础&203.移除链表元素、707.设计链表、206.反转链表 基础知识,问题,总结,发散思考很多
https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/494573
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。