自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(10)
  • 收藏
  • 关注

原创 union find(自用)

type unionfind struct { count int //连通分量数 parent []int } //初始化 //x的父节点指向自己 func InitUF(n int) *unionfind{ uf :=new(unionfind) uf.count = n uf.parent = make([]int,n) for i:=0;i<n;i++{ uf.parent[i] = i } return uf } //union func (u unionfin

2022-01-28 15:57:06 835

原创 LRU缓存

//链表结点 type Node struct { key, val int prev, next *Node } func initNode(key, val int) *Node { return &Node{key: key, val: val} } type DoubleListNode struct { head, tail *Node //虚头结点,尾节点 size int //链表元素数 } func initDoubleListNode() *D.

2021-12-17 23:19:19 324

原创 完全背包问题

func BagProblem(weight []int, wealth []int, maxweight int) int { m := len(weight) //先遍历物品,再遍历背包大小 dp := make([]int, maxweight+1) //begin for i := 0; i < m; i++ { //遍历物品 for j := weight[i]; j <= maxweight; j++ { //遍历背包 dp[j] = max(dp[j],

2021-12-15 23:32:58 1004

原创 0-1背包问题

func BagProblem(weight []int, wealth []int, maxweight int) int { m := len(weight) //先遍历物品,再遍历背包大小 dp := make([][]int, m) //初始化 for i := 0; i < m; i++ { dp[i] = make([]int, maxweight+1) } for i := weight[0]; i < maxweight; i++ { dp[0][i]

2021-12-15 23:09:30 798

原创 设计循环队列

结构设计 type MyCircularQueue struct { Queue []int front int //头指针 rear int //指向尾指针后面一个 Lenth int //队列长度 } 构造 func Constructor(k int) MyCircularQueue { q := MyCircularQueue{make([]int, k+1), 0, 0, k + 1} return q } enQueue(value): 向循环队列插入一个元素。如果成功插入则

2021-12-02 22:25:05 408

原创 trie模板

字典树 (单词查找树) 根节点没有字符 每个子节点有一个字符 从某个节点到他的某个子节点可连成一个单词 每个单词都不同 结构 type Trie struct { Children [26]*Trie //表示26个字母 IsEnd bool //表示此处是否组成一个完整的单词 } 初始化 //初始化 func Constructor() Trie { return Trie{} } 插入 //插入 func (this *Trie) Insert(word string) {

2021-12-02 15:37:36 1438

原创 堆及堆排序

堆是一种二叉树的形式 分为大顶堆和小顶堆 性质: ①完全二叉树 ②父节点≥或≤子节点 可以用数组来存储堆 父节点:(i-1)/2, 左子节点:2 * i+1, 右子节点:2 * i+2, 维护堆的性质 //维护堆的性质 (小顶堆) 把大的交换到下面去 func heapify(arr []int, root int) { len := len(arr) max := root //父节点 left := root*2 + 1 right := root*2 + 2 if right < le

2021-12-01 23:25:11 381

原创 对 concurrency-made-easy 文章的总结

原文链接 https://dave.cheney.net/paste/concurrency-made-easy.pdf 原文对 go 的并发中常常出现的bug 提出了一些建议,本文是对原文的建议做一些总结和自己的见解 一、不必要的goroutine的使用 如果一个goroutine在还没有获得另一个goroutine的返回结果时,无法取得进展,那么不如放弃goroutine的使用,只用这个goroutine完成工作 package main import ( "fmt"

2020-07-15 11:45:48 123

原创 对 GO并发的总结

1. 并发安全和锁 两个概念: ①临界资源:一次只允许一个进程独占访问(使用的)资源 ②临界区:进程中访问临界资源的程序段 在并发时可能会存在多个goroutine同时操作一个临界资源,这种情况会发生竞态问题(数据竞争),数据竞争会导致最后的结果与期待的不符。 这个时候我们可以通过给临界区加锁的方式来控制对共享资源的访问。 1.1互斥锁 互斥锁可以保证任何时间只允许一个goroutine可以访问共享资源 go中使用sync.Mutex来实现互斥锁 var lock sync.Mutex lock.Lock

2020-07-13 19:49:57 184

原创 对Uber Go Style Guide的理解和总结

1.不使用指向interface的指针 直接将接口作为值传递即可 传递过程中,底层数据仍然可以是指针 接口在底层的实质有两个字段:1.指向特定类型信息的指针 2.数据指针 2.接收器 ①使用值接收器的方法可以通过值或者指针调用 ②使用指针接收器的方法只能在指针或者可寻址值调用 type S struct { data string } func (s S) Read() string { return s.data } func (s *S) Write(str string) { s.da

2020-07-12 20:03:45 324

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除