LeetCode 刷题指南(一):为什么而刷题

虽说刷题一直备受诟病,不过不可否认刷题确实会锻炼我们的编程能力,相信每个认真刷题的人且见面发出体会。现在提供在线编程评测的平台产生诸多,比较知名的有
hihocoder,LintCode,以及这里我们关注之
LeetCode。

代码提交曲线

LeetCode 是一个好硬的 OJ(Online
Judge)平台,收集了诸多企业之面试题目。相对其他 OJ
平台而言,有着下面的几只长:

  • 问题全部来专业非常企业之真面试
  • 无须处理输入输出,精力都在解决具体问题达成
  • 题材来增长的讨论,可以参照别人的思绪
  • 精确了解自己代码在有着提交代码中运行效率的行
  • 支撑多主流语言:C/C++,Python, Java
  • 可以在线进行测试,方便调试

脚是自我刷 LeetCode 的有的赢得,希望能够引诱大家有空时刷刷题目。

题目:抽象思维

波利亚据此三如约开:《How
To Solve
It》、《数学的意识》、《数学及猜测》)来准备阐明人类解决问题之常见的思方法,总结起来要出以下几栽:

  • 时刻不忘未知量。即时刻别忘记您到底想求啊,问题是呀。(动态规划备受问题状态的设定)
  • 试错。对题目这里捅捅那里捣捣,用上具备的既知量,或动具有你想到的操作手段,尝试着探能不能够获有效的定论,能无克去答案近平步(回忆算法遭逢移动不连贯便回退)。
  • 求解一个类似的题目。类似之题材或者有类似的结构,类似之性,类似之解方案。通过考察或回忆一个看似的题材是如何化解之,也许就是可知借用一些要的要点(比较
    Ugly Number 的老三只问题:263. Ugly
    Number,
    264. Ugly Number
    II,
    313. Super Ugly
    Number)。
  • 用特例启发思考。通过考虑一个方便的特例,可以一本万利我们很快搜索有一般问题的败。
  • 反过来推导。对于众多问题而言,其要求的结论本身就是隐藏了想,不管这推断是充分的抑必不可少的,都特别可能针对解题有帮扶。

刷 LeetCode
的太可怜便宜就是可以磨练解决问题的思维能力,相信自己,如何错过想自身也是一个急需不断学习和练习的艺。

除此以外,大量胜质量的问题可以加深我们针对电脑对中经数据结构的深刻理解,从而得以快捷用当的数据结构去解决具体中的问题。我们视那个多ACM大牛,拿到问题后即时就会想有解法,大概就是盖她俩对此各种数码结构有深厚的认吧。LeetCode
上面的题目涵盖了几乎所有常用的数据结构:

  • Stack:简单的话具有后进先出的特点,具体采用起来吧是幽默,可以省题目
    32. Longest Valid
    Parentheses。
  • Linked
    List:链表可以便捷地插入、删除,但是找比较费劲(具体操作链表时组合图会简单很多,此外如果专注空节点)。通常链表的系问题可用双指针巧妙的解决,160.
    Intersection of Two Linked
    Lists
    可以协助我们重审视链表的操作。
  • Hash
    Table:利用
    Hash 函数来以数据映射到稳定的等同块区域,方便 O(1)
    时间内读取以及修改。37. Sudoku
    Solver
    数独是一个经文的回顾问题,配合 HashTable 的言语,运行时用大幅回落。
  • Tree:树于计算机课的使用非常大,常用之出二叉搜索树,红黑书,B+树等。树的起,遍历,删除相对来说比较复杂,通常会就此到递归的思路,113.
    Path Sum
    II
    是一个对的开胃菜。
  • Heap:特殊之毕二叉树,“等级森严”,可以用
    O(nlogn) 的时日复杂度来展开排序,可以据此 O(nlogk) 的日子复杂度找有 n
    个数中之极端老(小)k个,具体可以看 347. Top K Frequent
    Elements。

算法:时间空间

咱理解,除了数据结构,具体算法在一个程序中为是挺重中之重之,而算法效率的心胸则是时空复杂度和空中复杂度。通常状态下,人们再度关注时间复杂度,往往要找到比
O( n^2 )
快的算法,在数据量比较好之景象下,算法时间复杂度最好是O(logn)或者O(n)。计算机课中藏的算法思想便那么基本上,LeetCode
上面的题材涵盖了其中大部分,下面大致来拘禁下。

  • 分而治之:有点类似“大事化小、小事化了”的思,经典的汇合排序和快速排序都为此到这种思想,可以望
    Search a 2D Matrix
    II
    来理解这种考虑。
  • 动态规划:有点类似数学中的归纳总结法,找有状态转移方程,然后慢慢求解。
    309. Best Time to Buy and Sell Stock with
    Cooldown
    是知道动态规划之一个正确的事例。
  • 贪得无厌算法:有时候只顾局部利益,最终也会起极端好的全局收入。122.
    Best Time to Buy and Sell Stock
    II
    看看该如何“贪心”。
  • 搜索算法(纵深优先,广度优先,亚细分查找):在有限的解空间中寻找有满足条件的清除,深度与广度通常比较费时间,二瓜分查找每次可拿题目规模压缩一半,所以比较便捷。
  • 回溯:不断地去试错,同时要注意回头是岸,走不接入便变换条总长,最终为能够找到解决问题方法要了解问题无解,可以望
    131. Palindrome
    Partitioning。

当,还有一对题目可能得有数学知识去解决,或者是得一些个运算的技术失去飞化解。总之,我们愿意找到岁月复杂度低的化解方式。为了上这目的,我们也许用在一个解题方法被融合多种想,比如当
300. Longest Increasing
Subsequence
中又使用了动态规划和亚分叉查找的章程,将复杂度控制在
O(nlogn)。如果用另外办法,时间复杂度可能会见高多,这种题材的周转时统计图也正如有趣,可以见见不同解决方案运行时刻的英雄差异,如下:

365bet手机app下载 1

自然有时候我们会牺牲空间换取时间,比如以动态规划被状态的保留,或者是记忆化搜索,避免在递归中计算重复子问题。213.
House Robber
II
的一个Discuss会见教我们怎样用记忆化搜索减少程序执行时间。

言语:各发千秋

对一个题目吧,解题逻辑不会见盖编程语言而不同,但是实际coding起来语言里的异样还是那个非常的。用不同语言去化解和一个题材,可以让咱重好地失去领悟语言中的反差,以及特定语言的优势。

速度 VS 代码量

C++ 因飞快灵活著称,LeetCode
很好地证明了即或多或少。对于大部分问题来说,c++ 代码的运作速度要远超越
python 以及另外语言。和 C++ 相比,Python
允许我们就此更不见的代码量实现同的逻辑。通常状态下,Python程序的代码行数只相当给对应之C++代码的行数的三分之一左右。

以 347 Top K Frequent
Elements
为例,给得一个频组,求数组里涌出频率最高的 K 个数字,比如对于频繁组
[1,1,1,2,2,3],K=2 时,返回 [1,2]。解决该问题的思路比较健康,首先用
hashmap 记录每个数字的出现频率,然后可以据此 heap 来呼吁出现频率高的 k
个数字。

要是因此 python 来促成的话,主要逻辑部分之所以鲜实践代码就够用了,如下:

num_count = collections.Counter(nums)
return heapq.nlargest(k, num_count, key=lambda x: num_count[x])

本了,要惦记写有缺乏小优雅的 python 代码,需要针对 python
思想及模块出那个好之询问。关于 python
的相干知识点讲解,可以参考这里。

苟因此 C++
实现的话,代码会多群,带来的利益虽是快之霎时。具体代码在这里,建立大小也
k 的小顶堆,每次进堆时跟堆顶进行比,核心代码如下:

// Build the min-heap with size k.
for(auto it = num_count.begin(); it != num_count.end(); it++){
  if(frequent_heap.size() < k){
      frequent_heap.push(*it);
  }
  else if(it->second >= frequent_heap.top().second){
      frequent_heap.pop();
      frequent_heap.push(*it);
  }
}

语言的差别

咱们还懂得 c++ 和 python
是见仁见智之言语,它们持有明确的分别,不过同不小心我们就算见面遗忘她中的歧异,从而写有bug来。不信?来拘禁
69
Sqrt(x),实现
int sqrt(int x)。这问题是经的次私分查找(当然为足以为此更尖端的牛顿迭代法),用
python 来贯彻的语很容易写有 AC
的代码。

若因此 C++
的言辞,相信广大人口啊克免开求中间值的整型溢起底坑:int mid = low + (high - low) / 2;,于是写起下的代码:

int low = 0, high = x;
while(low <= high){
  // int mid = (low+high) / 2,  may overflow.
  int mid = low + (high - low) / 2;
  if(x>=mid*mid && x<(mid+1)*(mid+1)) return mid;
  else if(x < mid*mid)  high = mid - 1;
  else low = mid + 1;
}

好惋惜,这样的代码仍然是整型溢起底题材,因为mid*mid 有或超出
INT_MAX,正确的代码在这里。当我们为
python 的机关整型转换宠坏后,就特别容易忘c++整型溢起底问题。

而外臭名昭著的整型溢起问题,c++ 和 python 在各运算上吧保有一点不同。以
371 Sum of Two
Integers
为条例,不用 +, – 实现 int 型的加法
int getSum(int a, int b)。其实就算是模拟计算机内部加法的兑现,很显著是一个员运算的问题,c++实现起来比较简单,如下:

int getSum(int a, int b) {
    if(b==0){
        return a;
    }
    return getSum(a^b, (a&b)<<1);
}

不过用 python 的言语,情况易的复杂性了很多,归根到底还是以 python
整型的落实机制,具体代码在这里。

座谈:百贱的丰富

设说 LeetCode
上面的题材是一块块金子的言语,那么评论区就是一个点缀在钻的矿山。多少次,当您绞尽脑汁终于
AC,兴致勃发地赶到评论区准备吹水。结果迎接你的倒是是大师级的代码。于是,你高呼:尼玛,竟然好这么!然后闭关去想那些美好的代码,顺便偷鄙视自己。

除开好好之代码,有时候还会发生直观的解题思路分享,方便探望人家是怎么化解这题目的。@MissMary每当“两个排序数组中搜索有被位数”这个问题中,给闹了一个大过硬的分解:Share
my o(log(min(m,n)) solution with
explanation,获得了400多个赞。

公吧足以评大牛的代码,或者提出改善方案,不过起时分可能并非如你预期一样改进后码会运行地重好。在
51.
N-Queens
的讨论 Accepted 4ms c++ solution use backtracking and bitmask, easy
understand
中,@binz 在讨论区中纳煮自己拿反复组 vector<int>
(取值非零即一)改也 vector<bool> 后,运行时刻变慢。@prime_tang
随后虽深受来建议说最好不用为此 vector<bool>,并受起了两个
StackOverflow
答案。

当你游讨论区久了,你或会见产生那么一两独奇迹像,比如@StefanPochmann。他的一个粉丝
@agave 曾经问 StefanPochmann 一个题材:

Hi Stefan, I noticed that you use a lot of Python tricks in your
solutions, like “v += val,” and so on… Could you share where you
found them, or how your learned about them, and maybe where we can
find more of that? Thanks!

StefanPochmann 也不厌其烦地于闹了好的答案:

@agave From many places, though I’d say I learned a lot on CheckiO and
StackOverflow (when I was very active there for a month). You might
also find some by googling python code golf.

原先大神啊是以 StackOverflow 上修炼的,看来要在 干什么离开不起头
StackOverflow
中补充加一个理了:因为 StefanPochmann 都混迹于斯。

仿佛这样好,充满技术味道的讨论,在 LeetCode
讨论区遍地都是,绝对值得我们失去好看。

成人:大有益处

突发性会放旁边人说 XX 大牛 LeetCode 刷了3遍,成功上微软,还以了 special
offer!听起好像刷题就得缓解工作问题,不过要明了还有刷5总体 LeetCode
仍然没找到工作的人数否。所以,不要想方刷了诸多全套就是好找到好工作,毕竟比你刷的还狂之大有人在(开个玩笑)。

但,想想前列有的那些好处,应该值得大家抽出点时间来刷刷题了吧。

复多读

同波利亚学解题
何以我反对纯算法面试题
闲聊刷题
争看待中国学生以进
Google、微软相当企业疯狂地刷题?
LeetCode
编程训练
境内发生什么样好的刷题网站?

发表评论

电子邮件地址不会被公开。 必填项已用*标注