当前位置:   article > 正文

学了数据结构,做了200道算法题,但还是感觉没入门,拿到问题没法立马有想法,怎么破?_数据结构算法题无从下手

数据结构算法题无从下手

大家都经历过, 刷题不是目的,要有目的的刷题。

一、对于从来没刷过题的人,刷题前也需要准备

如果连最基本的数据结构,例如链表、队列、栈、二叉树都没有接触过,那么就先别刷题了。基本的数据结构先掌握,才有刷题的能力。

数据结构与算法应该首先知道:

  1. 时间复杂度
  2. 空间复杂度

一般最先接触的就是这两方面的学习了,这两个概念以及如何计算,是必学!也是必须最先学的,主要是最大复杂度,平均复杂度等等。

学习途径:可以看公开课进行学习,也可以搜索博客学习,或者是看书。建议刚开始别看《算法导论》,《我的第一本算法书》这本书中学生也可以读懂,还可以把数学基础打好了,至少看到数学符号不用慌张了。

3. 线性表

  • 列表(必学)
  • 链表(必学)
  • 跳跃表(知道原理即可,能自己实现出来一遍)
  • 并查表(刷题学习)

重点在于链表和列表。

4. 栈与队列

4. 树

  • 二叉树:各种遍历(递归与非递归)(必学)
  • 哈夫曼树与编码(原理与应用)
  • AVL树(必学)
  • B 树与 B+ 树(原理与应用)
  • 前缀树(原理与应用)
  • 红黑树(原理与应用)
  • 线段树(原理与应用)

树相关的知识非常多,建议以看书或者视频为主,《算法第四版》是一个还不错的选择。

不过刷题前也不需要准备那么多,最基础的二叉树学了就可以。

二、常见的算法思想是否有了?

LeetCode刷题之前还要学一些算法思想,一般就是:

  1. 递归
  2. 枚举
  3. 贪心
  4. 回溯
  5. 动态规划

重中之重!是递归!其他几种算法也会有递归的影子,二叉树的遍历等都包含递归的使用。所以刷题之前,或者是二叉树、图相关算法遇到递归的时候,需要静心认真摸索。如果递归不懂,那就会被虐~

在LeetCode可以做出hard级别的笔试题,也许在面试中medium级别的题做起来都费劲,因为笔试题相对灵活,基本上通过一些实际例子来引出一道题,所以我们很难判断去用什么方法比较好。

三、巩固基础知识

对于从未刷过题的人,上面内容是否已经掌握了。如果掌握了,我们接下来要知道在刷题过程中是在强化自己的基础知识。

第一遍刷题:

可以从简单开始,阅读审题之后思考解法。如果基础薄弱的话没什么思路的话就别浪费时间了。直接看答案,自己记录多个解题方法,选择方法的优劣。看过一边答案之后记得要默写。

第二遍刷题:

自己写一遍,这个时候无论如何都别看答案了,自己写完提交代码,有没有bug都没事的。要学会自己debug!调试完了,学习多种解题方法。并在这个步骤持续优化,可以将优化重点放在执行时间。

第三遍刷题:

重复之前刷过的题,专项练习。

第四遍刷题:

建议每隔一段时间,就反复复习自己刷过的题。避免刷了忘!

升级难度:

有了一定的基础之后,对照数据结构按照标签(指针用法、并差集、链表、哈希表、堆、栈、树、图、记忆搜索、动态规划)可以选择中等难度的题。

如果是面试前的话,可以选择困难难度的题去做。这个阶段要学会最优解。回到之前的简单问题就会觉得太轻松了。

对于笔试题

基本数据结构的考察:这类题相对来说还是比较简单的,主要考基本数据结构的操作例如二叉树的层序遍历,链表的逆序等。当然它不会直接告诉你,应该用什么方式。

基本算法思想的掌握:这类题需要我们掌握某种算法,比如动态规划、回溯、枚举、深度/广度、贪心、二分等。

边界条件的查看:这类型的题,基本上一看就会有思路,知道该怎么做,但是它的边界条件特别多,需要分很多种情况讨论。遇到这类题需要注意思维的严谨。

找规律、数学公式:主要是根据根据数据之间的一些关系,来找规律,进而推出他们的通用公式,就像我们高中的时候找数列的同项一样。

按照分类刷题:

熟悉一类提醒还是很有必要的,灵活使用了之后才能进一步的解决复杂问题。但是很多人总结了一些刷题模板,我觉得有必要自我总结,但没必要记别人的模板。只有反复练习才能加深理解。


【如何系统的学习算法】

但凡是算法导论》看不懂的同学,《我的第一本算法书》这本书初中生来了都能看懂。还可以把数学基础打好了,至少见到数学符号不慌。如果推荐网课的话,建议大家看黑马程序员数据结构与算法由浅入深、逻辑严密,值得大家反复听。

有的同学说,我的算法学的非常慢,可能是不适合学习算法。简单的说,算法学不会或者学的慢,完全是是因为代码写的少了,做的题太少了。

怎么看书呢?

对于小白来说,就按照顺序看,把里面的例子、代码都至少打一遍出来,还需要跑通。结果是要符合预期的,但如果不符合就调试到符合预期。在编程学习阶段,自己的理解和成功实现符合预期,完全是两回事。

每一章后面都会有练习题,挑几道题做一下,就算一眼知道怎么做,也要实现一遍。如果不知道的话就找答案,但是通通要过一遍跑通,我们坚持跑通90%的例子,这本书就算掌握了一半。

但是也要注意,书上很多是采用伪代码来实现的,不建议初学者看这类书籍,容易给自己看蒙了,代码也不好跑通也无法验证。所以呢,入门看视频,看书就看有完整代码的书籍。链表、队列、栈、二叉树、哈希表等基本的数据结构,就算入门了。

这个时候我们就已经具备了去刷Leetcode刷题的能力了,不过在学习的时候,特别是见到图那部分,会涉及到很多算法,比如最短路径深度搜索和广度搜索。当然二叉树的各种遍历也是。

如果我们对递归一点都不懂,那就会被虐

任何的高级算法与数据结构都会转换成if else,for循环,这些的根本还是计算机基础。高级算法重点是找到重复单元。

  • 跳转语句 (Branch) :If-else,switch
  • 循环 (Iteration) :for, which,while loop
  • 递归 (Recursion) : Divide & Conquer, Backtrace
  • 搜索 (Search) :深度优先搜索 Depth first search,广度优先搜索 Breadth first search,启发式搜索 A*
  • 动态规划 (Dynamic Programming)
  • 二分查找 (Binary Search)
  • 贪心 (Greedy)
  • 数学 (Math),几何 (Geometry)

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号