美文网首页数据结构和算法分析
LeetCode (算法与数据结构系列 2)

LeetCode (算法与数据结构系列 2)

作者: 剑指TOP | 来源:发表于2019-05-14 22:33 被阅读2次

学习数据结构与算法,三分靠学习,七分靠练习,优秀的程序员都在使用的在线练习的算法题平台,LeetCode。
https://leetcode.com/problemset/all/

下面跟随我一起进行一个简单的练习来熟悉操作。

选择练习题:
image.png

可以根据椭圆选择中的难易程度,练习状态,标签(数组,哈希表,链表等)进行选择。
直接选择第一个进行练习。

进行练习:
image.png
按照解题步骤,主要分为三块区域。
  • 答题前:1 问题描述区域
  • 答题中:2 作答区域
  • 答题后:3 解决方案和讨论区域

三块区域也和数据结构与算法的解题步骤一一对应,首先拿到题目之后一定要仔细审题,看看具体要考验的是哪些知识点。然后作答之前要列出你能想到的所有解决方案,然后从中挑选最优解(时间复杂度最低)。
最终测试自己的答案并提交后,在讨论区中看看其他人的方案是否一致,是否比你的思路更好,能否优化自己的解题思路。

下面已实际的思考过程为例:
  • 首先审题,给定一个数据,返回其中两个下标,满足条件 这两个下标对应的元素之和等于给定的特定值。
    本身这个题目很简单,考察数组的应用。

  • 其次列出解决方案,不需要写出所有方案,只需要简单对比时间复杂度即可,这也是为什么学习算法与数据结构的第一课就是学习时间复杂度:
    1)for 循环嵌套,遍历两次数据进行组合 O(n2):

func twoSum(nums []int, target int) []int {
    for i, v := range nums {
        for k, m := range nums {
            if i != k && v + m == target {
                return []int{i,k}
            }
        }
    }
    return []int{}
}

2)一次循环,将循环过被需要的数放进 map O(n)

func twoSum(nums []int, target int) []int {
    mapNeed := make(map[int]int)
    for i, v := range nums {
        if need, ok := mapNeed[v]; ok {
            return []int{need, i}
        } else {
            mapNeed[target - v] = i
        }
    }
    return []int{}
}

思考的过程中只需要简单的对比时间复杂度即可,不需要写出完整解决方案,我这里只是方便大家思考。
很迅速的思考就能得到第二种方案更优。

  • 查看别人的思路和解决方案是否和自己一致,如果其他人的更优秀需要研究他人的思路,再进行思考,练习。


    image.png

    多查看几个其他人的思路,大概就能得到一致的方案,这一题就到这里,可以进行下一题练习了。

系列会持续更新,需要查看可以进我主页。
如有疑问或者错误和遗漏,欢迎指正。

相关文章

网友评论

    本文标题:LeetCode (算法与数据结构系列 2)

    本文链接:https://www.haomeiwen.com/subject/bchyaqtx.html