最近无意中看到一个算法的网站,看着感觉介绍得挺系统的,虽然做算法以及指导学生开发各种算法这么些年了,却没有真正系统的学习过(几年前啃过算法导论,但是苦于那蹩脚的中文翻译,也没有去看英文原文)。为此决定好好学习一下,本博文为本人学习下面网站的资料的学习记录,本博文仅为本人学习记录用,随着学习的过程也会不断更新此间内容。
https://labuladong.github.io/algo/https://labuladong.github.io/algo/
Chrome 刷题插件安装
正所谓工欲善其事,必先利其器,首先下载Chrome浏览器及其插件:
https://chrome.google.com/webstore/detail/leetcode-helper-by-labula/elafhogmnaapleckojedgipgmidneccghttps://chrome.google.com/webstore/detail/leetcode-helper-by-labula/elafhogmnaapleckojedgipgmidneccg
安装成功后,可以在插件列表看到插件图标:
点击插件图标可以弹出插件弹窗,包含刷新数据的按钮和很多有用的链接:
建议在 Chrome/商店安装的,这样会在新版本发布后自动更新。
LeetCode 版可以通过点击链接进入:https://leetcode.com/list/9zwo3ww5/
随便点进去一个
感觉确实是很不错,还有一些小的功能可以看下面。此处先不介绍,后面涉及再补上。
Chrome 刷题插件安装使用手册
学习算法和刷题的框架思维
首先给出B站视频,建议看着视频来学习会更加直观。
【labuladong】学习数据结构和算法的框架思维
数据结构的存储方式只有两种:数组(顺序存储)和链表(链式存储)。
所谓的数组应该就是跟cpp里的差不多(连续的,顺序存储)。链表则是,数据+指向下一个数据的指针(非连续的,离散的存储)。
二者的优缺点如下:
数组由于是紧凑连续存储,可以随机访问,通过索引快速找到对应元素,而且相对节约存储空间。但正因为连续存储,内存空间必须一次性分配够,所以说数组如果要扩容,需要重新分配一块更大的空间,再把数据全部复制过去,时间复杂度 O(N);而且你如果想在数组中间进行插入和删除,每次必须搬移后面的所有数据以保持连续,时间复杂度 O(N)。
链表因为元素不连续,而是靠指针指向下一个元素的位置,所以不存在数组的扩容问题;如果知道某一元素的前驱和后驱,操作指针即可删除该元素或者插入新元素,时间复杂度 O(1)。但是正因为存储空间不连续,你无法根据一个索引算出对应元素的地址,所以不能随机访问;而且由于每个元素必须存储指向前后元素位置的指针,会消耗相对更多的储存空间。
数据结构的基本操作:遍历 + 访问(就是存储与修改数据,即增删查改)
数据结构种类很多,但它们存在的目的都是在不同的应用场景,尽可能高效地增删查改。
典型的通过迭代,进行遍历访问:
void traverse(int[] arr) {
for (int i = 0; i < arr.length; i++) {
// 迭代访问 arr[i]
}
}
参考资料
《算法秘籍》和《刷题笔记》。下载链接:https://pan.baidu.com/s/1PoG0Zxy7H64aXUM-Gj0UuA?pwd=541i 提取码:541i