查看: 1451| 回复: 5
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] 求助求讨论!如何克服这个刷题‘陋习’

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
楼主刷题也刷了300多了,经典的题目有些刷过两遍,目前开始复习之前刷过的,但是遇到了一点问题 T.T。就是有些题目之前做过有点印象,但是关键的步骤思路印象就很模糊,然后本能的就会尝试去回忆那个解法,导致思路就很局限,有时候还容易记错了。举个例子:像sliding window maximum,第二次做的时候楼主记得要用deque也知道存index到deque里面,但是当加入新的element,要把之前加入过的但是比current element小的元素都poll出来,理应维持一个monotonic queue,poll queue尾端的元素,但是尝试着去回忆解法时,就莫名其妙记成了poll queue前面的元素。类似的例子还有像max subarray,知道要用kadane algorithm, 然后脑海里就拼命回想竟然连变量名都蹦出来了:maxEndingHere, maxSoFar...。楼主不知道是因为不熟练所以得多刷一样的题目到能噼里啪啦一同敲键盘直接AC的阶段,还是应该改变自己做题目的策略或者思考方式。感觉这是个不太好的习惯。。有没有朋友有相同的经历或者有什么对策,欢迎大家来讨论!

上一篇:常见followup,如果用户量很大/如果多线程 你要怎么优化你的solution
下一篇:概率题求助
推荐
Luffy_Tse 2019-9-17 02:57:31 | 只看该作者
全局:
可能“刷题”的这个名字给了大多数人一个错觉, 感觉像是当年准备GRE背红宝和再要你命3000的时候刷单词一样。
然而除非说你打算把1000+题&面经都背诵下来,不然不建议用回忆来处理题目。刷题刷的是题感,更类似于咱们从做到大的数学题(应用题)。
想想看你做这些应用题肯定不会去想着把题目背下来或者想以前做过什么相似的题目不是?把算法、数据结构都学好了,然后每次拿到题目先开始分析,把问题抽象成程序语言,然后进一步寻找说实现算法所需要的数据结构以及可以用的算法(二分法、dfs、bfs等等)

比如你举的例子,虽然你有印象用的是deque,但是最好的方式是分析出为什么用deque,那么你就不用有那样的错误。
对于sliding window maximun,首先我们用一个list来存储这个sliding window
然后当我们要找max的时候,我们会发现max之前的所有num都是不需要的,对于后续完全造成不了影响,因此让我们要加入max的时候,我们就可以把之前小于max的num都挪出来,然后再把max放进去 -> 于是我们可以用类似stack的结构
然后我们又发现,当进入下一个loop的时候,我们需要挪动window,所以我们要把这个list的最前边不在window里边的挪出去 -> 这就可以用queue的结构
两个结合我们就发现我们需要deque。

所以我的建议是,刷题的时候,不要只想着背题背算法,怎么背都没办法背完的。每道题都要分析,从问题抽象到算法语言,然后再去写代码 -> 尽量联系白板写完sudu code之后再开始实现。

评分

参与人数 1大米 +2 收起 理由
lisicheng123 + 2 特别优秀,给你点赞!

查看全部评分

回复

使用道具 举报

🔗
cszj 2019-9-16 08:56:19 来自APP | 只看该作者
全局:
个人记忆记忆模糊蛮好的,因为给你机会去推出来。 不是要背答案,是要理解为什么这么做,这么写解决了什么痛点
回复

使用道具 举报

🔗
337845818 2019-9-16 10:19:05 | 只看该作者
全局:
不会做就是不会做,方法可以不一样但是结果是一样。

你可以刷题背诵, 可以考理解,可以靠灵光一现, 其实都可以,找准你最喜欢的那个。这个步骤就是多做题, 多见题解。

以maximum subarray为例, 我之前应该是见过kadanes algo,但是不喜欢,因为我理解不了。

网上搜了一下, 果然有maxsofar词汇云云, 你如果不懂,不理解, 自然无法写出这个代码。

送你一个我非常能理解max subarray的做法,也许你会开拓一下思想。

maximub subarray:

找[j, k] index 使得 a[j] + a[j +1] + ... + a[k] 最大,0 <= j <= k < n

令 s[j + 1] = a[0] + a[1] + .. + a[j], s[0] = 0, 即问题变为寻找最大的s[k + 1] - s[j]

伪代码:
for k = 0 to n - 1
  for j =  0 to k
    ans = max(s[k + 1] - s[j]) // j循环中最大的数字

注意进入J循环时, s[k + 1] 为常数项。
那么, 算法可修改为

for k = 0 to n - 1
  for j =  0 to k
    mini = min(s[j]) // j 循环中最小的数字
  ans = max(s[k + 1] - mini)

可再优化为

mini = 0
for k = 0 to n - 1
  ans = max(s[k + 1] - mini)
  mini = min(s[k + 1])

几个股票题基本也是同出一辙。
回复

使用道具 举报

🔗
337845818 2019-9-16 10:19:40 | 只看该作者
全局:
刷题是个习惯, 你多刷点。

补充内容 (2019-9-16 12:34):
回复也能被审核我佛了
https://ibb.co/10P0jFP
回复

使用道具 举报

🔗
 楼主| gatechkc 2019-9-17 11:41:12 | 只看该作者
全局:
Luffy_Tse 发表于 2019-9-17 02:57
可能“刷题”的这个名字给了大多数人一个错觉, 感觉像是当年准备GRE背红宝和再要你命3000的时候刷单词一样 ...

十分感谢你的回复!以后做题的时候还是得好好分析一步步推倒。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表