之前也尝试刷过算法,但是一段时间之后就不继续了,现在找了一个比较功利的算法练习课程,再从头到尾刷一遍试试看。
笔记记录的方法为先看一遍课程,然后再练习、整理记录。
书籍:《异类 —— 不一样的成功启示录》
学习方法:
规范化练习思路,切题四件套
reverse-linked-list (opens new window)
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func reverseList(head *ListNode) *ListNode {
var next *ListNode
for head != nil {
// 思路:当前节点的 next 换成上一个的指针,同时需要一个变量 next 缓存上一个指针
// 每次循环记录当前节点指针到缓存变量中
// 这里交换涉及到中间变量,这么想会比较简单,先进行交换,发现交换的值需要使用,再使用 tmp 缓存下来
// 例如 当前 next 换成之前缓存的,那么 head.Next = next
// head.Next 是下一个节点,是有用的,所以在这之前定义 tmp := head.Next
// 这么想不容易闹混
tmp := head.Next
head.Next = next
next = head
head = tmp
}
return next
}
相关习题:
解法提示:
使用数组或者链表实现均可。
常见数据结构时间复杂度(来源 https://www.bigocheatsheet.com/ (opens new window)):
来源:Big O Cheat Sheet (opens new window)
valid-parentheses (opens new window)
Go 使用数组实现 stack 要点:
// pop
stack = stack[:len(stack) - 1]
// peak
stack[len(stack)-1]
// push
stack = append(stack, v)
提示:负负得正,使用两个栈或者队列实现
PriorityQueue 优先队列列:正常入、按照优先级出
实现机制:
Mini Heap 小顶堆:最小元素最上面,根节点小于左右孩子
Max Heap 大顶堆:相反
kth-largest-element-in-a-stream (opens new window)
提示: