学习数据结构与算法,三分靠学习,七分靠练习,优秀的程序员都在使用的在线练习的算法题平台,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
多查看几个其他人的思路,大概就能得到一致的方案,这一题就到这里,可以进行下一题练习了。
系列会持续更新,需要查看可以进我主页。
如有疑问或者错误和遗漏,欢迎指正。
网友评论