转载于 东心十_关于leetcode刷题详细介绍

虽然刷题一直饱受诟病,不过不可否认刷题确实能锻炼我们的编程能力,相信每个认真刷题的人都会有体会。现在提供在线编程评测的平台有很多,比较有名的有 hihocoder,LintCode,以及这里我们关注的 LeetCode。 LeetCode收录了许多互联网公司的算法题目,被称为刷题神器,我虽然早有耳闻,不过却一直没有上面玩过。

  据了解,LeetCode 是一个非常棒的 OJ(Online Judge)平台,收集了许多公司的面试题目。相对其他 OJ 平台而言,有着下面的几个优点:

  • 题目全部来自业内大公司的真实面试
  • 不用处理输入输出,精力全放在解决具体问题上
  • 题目有丰富的讨论,可以参考别人的思路
  • 精确了解自己代码在所有提交代码中运行效率的排名
  • 支持多种主流语言:C/C++,Python, Java
  • 可以在线进行测试,方便调试

笔者刷leetcode的主要目的
1、熟悉各互联网公司的算法题目,为找工作做准备。
2、复习以前学过的编程语言,LeetCode支持几乎所有主流编程语言,大家可以用不同语言来做题。
3、熟悉常见的算法和数据结构,LeetCode提供了交流平台,一些大神会将自己的解法贴出来共享,有些巧妙的解法实在令人叫绝。
4、学习别人的编程思维,加快编程的速度,避免常见的BUG。
  另外LeetCode的题型都非常简单明了,并不需要的复杂的理解,一般都在50行以内就可以解决了,如果你写了上百行代码,就肯定说明你想太多了或太复杂,虽然都能用很短的代码就能解决,但并不意味着LeetCode的题目非常简单,实际上LeetCode基本上涉及到了所有常规的算法类型。
下面是我刷 LeetCode 的一些收获,希望能够引诱大家有空时刷刷题目。

问题:抽象思维
波利亚用三本书:《How To Solve It》、《数学的发现》、《数学与猜想》来试图阐明人类解决问题的一般性的思维方法,总结起来主要有以下几种:

  1. 时刻不忘未知量。即时刻别忘记你到底想要求什么,问题是什么。(动态规划中问题状态的设定)
  2. 试错。对题目这里捅捅那里捣捣,用上所有的已知量,或使用所有你想到的操作手法,尝试着看看能不能得到有用的结论,能不能离答案近一步(回溯算法中走不通就回退)。
  3. 求解一个类似的题目。类似的题目也许有类似的结构,类似的性质,类似的解方案。通过考察或回忆一个类似的题目是如何解决的,也许就能够借用一些重要的点子(比较 Ugly Number 的三个题目:263. Ugly Number, 264. Ugly Number II, 313. Super Ugly Number)。
  4. 用特例启发思考。通过考虑一个合适的特例,可以方便我们快速寻找出一般问题的解。
  5. 反过来推导。对于许多题目而言,其要求的结论本身就隐藏了推论,不管这个推论是充分的还是必要的,都很可能对解题有帮助。

  刷 LeetCode 的最大好处就是可以锻炼解决问题的思维能力,相信我,如何去思考本身也是一个需要不断学习和练习的技能。此外,大量高质量的题目可以加深我们对计算机科学中经典数据结构的深刻理解,从而可以快速用合适的数据结构去解决现实中的问题。我们看到很多ACM大牛,拿到题目后立即就能想出解法,大概就是因为他们对于各种数据结构有着深刻的认识吧。LeetCode 上面的题目涵盖了几乎所有常用的数据结构:

  1. Stack:简单来说具有后进先出的特性,具体应用起来也是妙不可言,可以看看题目 32. Longest Valid Parentheses。
  2. Linked List:链表可以快速地插入、删除,但是查找比较费时(具体操作链表时结合图会简单很多,此外要注意空节点)。通常链表的相关问题可以用双指针巧妙的解决,160. Intersection of Two Linked Lists 可以帮我们重新审视链表的操作。
  3. Hash Table:利用 Hash 函数来将数据映射到固定的一块区域,方便 O(1) 时间内读取以及修改。37. Sudoku Solver 数独是一个经典的回溯问题,配合 HashTable 的话,运行时间将大幅减少。
  4. Tree:树在计算机学科的应用十分广泛,常用的有二叉搜索树,红黑书,B+树等。树的建立,遍历,删除相对来说比较复杂,通常会用到递归的思路,113. Path Sum II 是一个不错的开胃菜。
  5. Heap:特殊的完全二叉树,“等级森严”,可以用 O(nlogn) 的时间复杂度来进行排序,可以用 O(nlogk) 的时间复杂度找出 n 个数中的最大(小)k个,具体可以看看 347. Top K Frequent Elements。

算法设计和分析比实现更重要
  我们知道,除了数据结构,具体算法在一个程序中也是十分重要的,而算法效率的度量则是时间复杂度和空间复杂度。对于一道编程问题,选用不同的数据结构和算法会得到不同的实现方式,比如“最长公共子串”。所以光能写出问题的实现还不够,还需要知道怎么针对问题设计算法,然后分析算法的复杂度来比较不同实现直接的优缺点。因此刷题之外,还需要记住每种算法实现的时间复杂度和空间复杂度。最常用的是Big O notation。一般情况下,人们更关注时间复杂度,往往希望找到比 O( n^2 ) 快的算法,在数据量比较大的情况下,算法时间复杂度最好是O(logn)或者O(n)。计算机学科中经典的算法思想就那么多,LeetCode 上面的题目涵盖了其中大部分,下面大致来看下。

  1. 分而治之:有点类似“大事化小、小事化了”的思想,经典的归并排序和快速排序都用到这种思想,可以看看 Search a 2D Matrix II 来理解这种思想。
  2. 动态规划:有点类似数学中的归纳总结法,找出状态转移方程,然后逐步求解。 309. Best Time to Buy and Sell Stock with Cooldown 是理解动态规划的一个不错的例子。
  3. 贪心算法:有时候只顾局部利益,最终也会有最好的全局收益。122. Best Time to Buy and Sell Stock II 看看该如何“贪心”。
  4. 搜索算法(深度优先,广度优先,二分搜索):在有限的解空间中找出满足条件的解,深度和广度通常比较费时间,二分搜索每次可以将问题规模缩小一半,所以比较高效。
  5. 回溯:不断地去试错,同时要注意回头是岸,走不通就换条路,最终也能找到解决问题方法或者知道问题无解,可以看看 131. Palindrome Partitioning。

  当然,还有一部分问题可能需要一些数学知识去解决,或者是需要一些位运算的技巧去快速解决。总之,我们希望找到时间复杂度低的解决方法。为了达到这个目的,我们可能需要在一个解题方法中融合多种思想,比如在 300. Longest Increasing Subsequence 中同时用到了动态规划和二分查找的方法,将复杂度控制在 O(nlogn)。如果用其他方法,时间复杂度可能会高很多,这种题目的运行时间统计图也比较有意思,可以看到不同解决方案运行时间的巨大差异,如下:

语言:各有千秋
对一个问题来说,解题逻辑不会因编程语言而不同,但是具体coding起来语言之间的差别还是很大的。用不同语言去解决同一个问题,可以让我们更好地去理解语言之间的差异,以及特定语言的优势。笔者会针对每题使用三种语言解决问题c++、java、python。

千里之行,始于足下,接下来笔者讲讲如何使用leetcode。

一、选择题目类型
最上面标签栏Problems,给出了三个分类:Algorithms、Database、Shell,分别表示算法题、数据库题、Shell脚本题,第一个就是我们所需要的算法题。

二、选择算法题
点开Algorithms后,我们可以看到一列题目的列表,每个题目都有独一无二序号,后面的接受率(Acceptance)表示提交的正确率,Difficulty表示难易程度。
LeetCode按难易程度分成了:Hard、Medium、Easy三个级别。
Easy级别一般并不需要太多思考就可以想到算法,甚至可以通过直接的方式,特别适合新手去熟悉编程语言。
Medium级别就会有些难度,一般都会涉及到经典的算法,需要一定的思考。
Hard级别是最难的,有些时候是算法本身的难度,有些时候特别需要你考虑到各种细节。
每个题目前面的小箭头表示该题已经完成。题目列表最上方有一个Choose one filter,可以将已完成的题目从列表中去掉。

三、筛选某一类型的题
如果我们只想要找某一类型的题,可以通过Tags或Company来筛选,如果我们只想做关于字符串、数组或链表相关题,可以通过Tags, 在Tags旁边可以根据公司找题(这一功能需要收费)。
如果我们再做某一题时,觉得还想再做一个类似的,巩固一下,可以通过该题下面的Show Similar Problems和Tags来找到相似的问题

四、如何和别人讨论
每个题目都有各自的Discuss按钮,点击进入后,就能看到了讨论区。
在这里,许多人都把自己的代码放到了上面,就像BBS一样,你可以发贴提问,也可以回复别人。

五、关于代码编写、测试与提交
点开我们选择的题目后,就可以进行代码编写了,LeetCode一般都会直接提供一个函数式接口,我们只需要编写函数内部就可以了,而需要考虑到库文件,另外,在上面选择栏中,可以切换选择自己需要的编程语言。

程序编写完了之后,不要急着提交(Submit Solution 按钮),先可以测试运行下(Run Code),我们还可以点开Custom TestCase旁边的小框,点开后,可以在里面输入我们自己设定的输入值。
一般情况,数组的输入形式是[a1,a2,a3,a4……]
当然我们测试完整无误后,再选择提交Submit Solution。
如果出现错误,会有提示。
如果正确无误,会有如下提示:

我们可以点开More Details查看详细结果说明
或者点开Next challenges 旁边的题继续做题。

六、查看自己提交的题目

在最上面标签栏找到自己,选择:
My Submissions:可以找到自己提交的题目(包括了正确提交和错误提交)提交的代码也是都是可以看到的
Manage Sessions:主要是管理自己的提交情况,错误率和正确率,总完成率之类。

   每道题旁边的My Submissions可以找到自己的对于该题的提交情况,点开后,就可以找到自己过去所有的提交。
  • 1


  点Accepted 或 Wrong Answer就可以查看自己过去提交的代码情况,当然还有得分。


http://www.taodudu.cc/news/show-2407141.html

相关文章:

  • 刷完 900 多道算法题的首次总结:LeetCode 应该怎么刷?
  • 语音识别智能开关 第一期
  • [物联网+云存储]-关于人工智能开关的学习思路
  • Java代码练习1 智能开关灯
  • 智能开关如何实现双控
  • 智能家居设计原理c语言,基于STM32的小型智能家居系统设计
  • 阳阳智能开关固件2.0版本
  • python控制灯开关_通过树莓派控制电灯开关
  • 基于51单片机的智能时控开关设计
  • 智能开关的零火版和单火版有什么区别
  • 改造家里的开关为智能开关,保留原有开关控制,零火版,HomeKit篇(三)
  • Zigbee智能开关和单火取电技术
  • 智能家居 | 手把手教你自制原生 HomeKit 智能开关,成本仅 10 元!
  • 乐鑫科技推出基于 ESP32-C3 的 Wi-Fi 单火线智能开关方案
  • 刘汉国老师的3路单火智能开关
  • 智能开关双控实现方法(附电路图)
  • 飞阳物联平台,智能开关2.0版本支持凌动开关
  • 智能开关设计设计
  • 远程智能开关安装方法
  • 智能家居1 涂鸦开关接入homeassistant
  • 一文入门智能开关的3种功能形态
  • esp8266智能开关灯制作教程
  • 单火开关和零火开关的区别
  • 【智能家居】智能单火开关目前普遍存在的问题
  • 浅谈(零火)智能开关和(单火)智能开关的工作原理和优势区别
  • 智能开关开发进展
  • 【基于stm32f103c8t6RFID-RC522智能开关】
  • 改造家里的开关成为智能开关,保留原有开关控制,零火版,基础入门(一)
  • 单火线智能开关设计笔记
  • 智能高侧开关

【 力扣(LeetCode)刷题详细介绍】相关推荐

  1. Leetcode-How-What 力扣Leetcode刷题指南

    Leetcode-How-What 力扣Leetcode刷题指南 About the way how to use Leetcode wisely for preparing the intervie ...

  2. 力扣(LeetCode)刷题,简单+中等题(第35期)

    力扣(LeetCode)定期刷题,每期10道题,业务繁重的同志可以看看我分享的思路,不是最高效解决方案,只求互相提升. 第1题:解码异或后的排列 试题要求如下: 回答(C语言): /*** Note: ...

  3. 力扣(LeetCode)刷题,简单+中等题(第34期)

    目录 第1题:整数转罗马数字 第2题:电话号码的字母组合 第3题:二叉树的所有路径 第4题:砖墙 第5题:下一个排列 第6题:括号生成 第7题:删除并获得点数 第8题:全排列 第9题:颜色分类 第10 ...

  4. 力扣(LeetCode)刷题,简单+中等题(第33期)

    目录 第1题:Z 字形变换 第2题:删除字符串中的所有相邻重复项 第3题:基本计算器 II 第4题:螺旋矩阵 第5题:螺旋矩阵 II 第6题:盛最多水的容器 第7题:删除有序数组中的重复项 II 第8 ...

  5. 力扣(LeetCode)刷题,简单+中等题(第32期)

    目录 第1题:数组的度 第2题:托普利茨矩阵 第3题:爱生气的书店老板 第4题:翻转图像 第5题:有效的数独 第6题:无重复字符的最长子串 第7题:区域和检索 - 数组不可变 第8题:二维区域和检索 ...

  6. 力扣(LeetCode)刷题,简单+中等题(第31期)

    目录 第1题:同构字符串 第2题:最后一块石头的重量 第3题:最小路径和 第4题:键盘行 第5题:存在重复元素 II 第6题:两数相加 第7题:三个数的最大乘积 第8题:等价多米诺骨牌对的数量 第9题 ...

  7. 力扣(LeetCode)刷题,简单+中等题(第30期)

    目录 第1题:单词规律 第2题:找不同 第3题:在排序数组中查找元素的第一个和最后一个位置 第4题:使用最小花费爬楼梯 第5题:寻找峰值 第6题:字符串中的第一个唯一字符 第7题:两个数组的交集 II ...

  8. 力扣(LeetCode)刷题,简单+中等题(第29期)

    目录 第1题:分割数组为连续子序列 第2题:翻转矩阵后的得分 第3题:寻找旋转排序数组中的最小值 第4题:乘积最大子数组 第5题:不同路径 第6题:判断路径是否相交 第7题:摆动序列 第8题:单调递增 ...

  9. 力扣(LeetCode)刷题,简单+中等题(第28期)

    目录 第1题:翻转单词顺序 第2题:顺时针打印矩阵 第3题:总持续时间可被 60 整除的歌曲 第4题:字符串的最大公因子 第5题:上升下降字符串 第6题:将数组分成和相等的三个部分 第7题:可被 5 ...

  10. 力扣(LeetCode)刷题,简单题(第27期)

    目录 第1题:独一无二的出现次数 第2题:速算机器人 第3题:岛屿的周长 第4题:按照频率将数组升序排序 第5题:根据数字二进制下 1 的数目排序 第6题:能否连接形成数组 第7题:强整数 第8题:查 ...

最新文章

  1. 如何使用敏捷工具Leangoo脑图做Epic/ Theme /Story 管理
  2. windows10 下 cuda安装
  3. c++11 字符串与int类型的转换
  4. Mybatis常见面试题(转)
  5. 【AutoML】如何选择最合适的数据增强操作
  6. 完美解决移动Web小于12px文字居中的问题
  7. JS表情替换代码,这里使用字符代替图片路径
  8. c 语言 模板函数,函数模板特化
  9. 3.21日 爬虫小计
  10. 空值用前值填充_用Excel进行数据处理
  11. 打包bat等文件成exe,双击运行不显示dos窗口,exe不报毒
  12. AsyncTask类浅析
  13. 自动化运维工具Ansible之roles
  14. 线程与进程的区别及其通信方式
  15. 60.Linux/Unix 系统编程手册(下) -- SOCKET: 服务器设计
  16. 最新电视直播PHP源码V1.2
  17. python敏感词过滤替换_浅谈Python 敏感词过滤的实现
  18. CZMDUI,简约而不简单的typecho模板
  19. PDF如何加水印? PDF加水印的方法
  20. 微信商户号进件接口,错误之 重新确认最终受益人字段

热门文章

  1. c语言文件操作可重入,C语言试题
  2. Ubuntu下安装网易有道词典
  3. Win10:修改电脑桌面路径
  4. 四 国内IP核相关企业及其分析
  5. x1000e rtl wifi 移植
  6. 【DVB】【ATSC】ATSC和DVB数字电视系统的比较
  7. 童年的李子明都长大了,你还会去买一罐旺仔牛奶吗?
  8. 最近在做微信支付委托代扣交互图。总结了几点需要注意的地方,与大家分享一下
  9. 常见的平面设计风格有哪些?
  10. 1.5时钟控制的触发器(钟控JK、钟控T触发器)