自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 154. 寻找旋转排序数组中的最小值 II

链接题目.难度:high解答:思路还是二分法的思路,但是因为允许存在重复的元素,所以当mid的元素跟start和end相等的时候,其实判断不出来mid元素是属于左边还是右边的,所以这时候直接简单的start++,因为这个操作总是安全的。其他情况我们每次排除大概1/2的数据package mainimport "fmt"func findMin(nums []int) int {...

2020-02-23 21:41:20 86

原创 152. 乘积最大子序列

链接题目.难度:middle解答:这个与最大子序列和是一样的,维护两个dp,表示以i结尾的最大乘积和最小乘积。优化:由于当前的值的计算只依赖上一个的结果dp数组可以优化为dp变量package mainimport "fmt"func maxProduct(nums []int) int { dpMax := make([]int, len(nums)) dpMin :=...

2020-02-18 21:45:22 79

原创 shuffle算法

shuffle算法应用很多,比如n个元素里面随机抽取m个元素,最重要的特性就是我们要保证每个位置上出现任意一个数的概率都是1/nvoid shuffle(vector<int>&arr){ for (int i=arr.size()-1;i>=0;--i) { swap(arr[rand()%(i+1)],arr[i]); }}对于arr[i],洗牌...

2020-02-16 16:55:34 1066

原创 乘法问题,次方问题

m*n的问题,其实操作系统是用位移来代替乘法的,这才实现了o1的复杂度,对32bit的乘法,最多执行32次的位移和加法运算次方问题归根到底是乘法问题,而每次乘法可以看作o1,所以算法就只能在减少乘法的次数上做功夫,我们可以把n做分解,表示成二进制形式,并且计算出前面的后面的也好计算。也可以使用递归,反正最后只需要logn次乘法...

2020-02-15 22:56:09 357

原创 排序问题

对于topn的问题,一般用最小堆来实现。唯一能实现On复杂度的就是桶排序,前提条件是待排序的key是有限集合,比如用户的年龄,用这个方式我们都能在on的时间复杂度以内找到排名m~n的元素。但是对于key无限大的情况,要取第m个元素也只需要on的复杂度,具体的算法就是利用快排的思路,每次找一个元素,快排一次,就可以得出左右两边分别有多少个元素,这样每次范围缩小一半,最终的平均复杂度是on...

2020-02-15 22:45:05 69

原创 tcp backlog

两个队列底层维护一个SYN_RECEIVED队列和一个ESTABLISHED队列,当SYN_RECEIVED队列中的连接返回ACK后,将被移动到ESTABLISHED队列中。backlog指的是ESTABLISHED队列的大小。SYN_RECEIVED队列的大小由proc/sys/net/ipv4/tcp_max_syn_backlog系统参数指定,ESTABLISHED队列由backlog和...

2020-02-14 12:11:24 114

原创 codis

功能Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有显著区别 (不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 R...

2020-02-13 12:41:44 187

原创 mysql意向锁

背景协调行锁和表锁举个栗子当一个事务添加某个表的行锁以后,比如update,这时会在这张表上面加一个表锁,那么另一个事务如果想加表锁就会block住。这个机制是mysql自带的,用于协调行锁和表锁的逻辑关系。意向锁都是表锁。...

2020-02-13 12:11:35 131

转载 垃圾回收机制

常见 GC 算法趁着这个机会我总结了一下常见的 GC 算法。分别是:引用计数法、Mark-Sweep法、三色标记法、分代收集法。引用计数法原理是在每个对象内部维护一个整数值,叫做这个对象的引用计数,当对象被引用时引用计数加一,当对象不被引用时引用计数减一。当引用计数为 0 时,自动销毁对象。目前引用计数法主要用在 c++ 标准库的 std::shared_ptr 、微软的 COM 、O...

2020-02-13 01:53:58 73

原创 golang调度器

概述go通过goroutine实现用户态的执行流切换,goroutine有几个好处用户态切换(网络或者channel,mutex等),不占用资源可变大小的栈,占用资源少隐藏底层poller(主要是epoll实现的netpoller细节)和调度细节,使用起来简单,以同步方式实现异步的性能G M PG: goroutine,就是平常提到的go中的协程M: machine,线程,就是平...

2020-02-13 01:43:20 201

原创 牛客网:最大点集合

链接难度:high解答:先对x降序,那么后面的点的y如果小于前面任意点的y,则必不符合条件,同时,如果前面的所有点的y都比它小,那么他一定满足条件。当x相等的时候,特殊处理。package mainimport ( "bufio" "fmt" "os" "sort" "strconv" "strings")type point struct { x, y int...

2020-02-09 19:50:40 432

原创 二叉树的前序遍历144后序遍历145-迭代方式

链接题目.题目.难度:middle解答:看注释。其实递归就是自己用一个stack模拟递归使用的函数栈package maintype TreeNode struct { Val int Left *TreeNode Right *TreeNode}func preorderTraversal(root *TreeNode) []int { vals := ma...

2020-02-08 17:26:52 60

原创 143. 重排链表

链接题目.难度:middle解答:常规操作,链表的插入和翻转package mainimport "fmt"type ListNode struct { Val int Next *ListNode}func printList(root *ListNode) { num := 0 for root != nil { fmt.Printf("->%d"...

2020-02-08 17:09:00 76

原创 142. Linked List Cycle II

链接题目.难度:middle解答:经典的链表环求环入点的问题,最关键的是找到环。最骚的环节是,为什么从环的入口和第一次meet的点同时出发再次相遇的时候会是环的入口。package mainimport ( "fmt")type ListNode struct { Val int Next *ListNode}func detectCycle(head *Lis...

2020-02-08 16:48:07 78

原创 Effective Go

新语言golang是一门新的语言,它有自己的特性和规则,如果直接照搬照抄c++或者java语言的编程经验,而不是根据go语言提供的特性来写程序,那么写出来的程序必定不伦不类。比如我看到一个网络proxy库的作者,对每一个客户端发来的网络请求缓存到一个channel里面,然后开启指定个数的worker去处理这些请求。这完全是没必要的。每个客户端请求直接去访问后端请求就行了,因为go语言已经做了异步...

2020-02-07 13:08:35 105

原创 牛客网;最长的可整合子数组的长度

链接题目.难度:high解答:dp[i]表示以s[i]为结尾的字符串的最长可整合字符串。在这里我们用seg来表示有多少个段,其实还可以更简单,判断在m里面的max - min + 1 == len(m)此时就是满足条件的package mainimport ( "bufio" "fmt" "os" "strconv" "strings")func convInts(...

2020-02-05 19:24:55 262

原创 139. 单词拆分

链接题目.难度:high解答:用递归是最简单的,可惜会超时。一般来说递归超时了,就尝试用dp吧,这两者简直亲兄弟package mainimport "fmt"import "strings"func wordBreak1(s string, wordDict []string) bool { if len(s) == 0 { return true } for...

2020-02-05 17:23:47 108

原创 牛客网 雀魂启动

package mainimport ( "bufio" "fmt" "os" "strconv" "strings")func convInts(ss []string) []int { result := make([]int, len(ss)) for i, v := range ss { res, err := strconv.ParseInt(v, 10, 6...

2020-02-04 21:23:33 296

原创 [牛客网] 万万没想到之聪明的编辑

package mainimport ( "bufio" "fmt" "os" "strconv" "strings")func convInts(ss []string) []int { result := make([]int, len(ss)) for i, v := range ss { res, err := strconv.ParseInt(v, 10, 6...

2020-02-04 20:04:43 534

原创 牛客:[编程题]万万没想到之抓捕孔连顺

链接木有,全部贴上来不大好吧难度:middle解答:拿到题不慌,首先分析这是干啥的。其实就是个组合问题,现在问题的关键就是找准组合的起始地址。虽然是嵌套循环,但是每个元素只是被i或者j遍历2次,所以复杂度还是npackage mainimport ( "bufio" "fmt" "os" "strconv" "strings")func convInts(ss []...

2020-02-04 19:49:28 482

原创 137. 只出现一次的数字 II

链接题目.难度:high解答:我们可以统计每一个bit上的0或者1出现的次数。这样的话其实可以把3换成n。虽然有更牛逼的异或来模拟三进制解决,但是我觉得不够通用不够好理解。package mainimport "fmt"func singleNumber(nums []int) int { result := 0 for i := uint(0); i < 32; i...

2020-02-04 15:03:48 75

原创 nftables intro

whatnftables 是新的数据包分类框架,旨在替代现存的 {ip,ip6,arp,eb}_tables。简而言之:它在 Linux 内核版本高于 3.13 时可用。它有一个新的命令行工具 ntf,它的语法与 iptables 不同。它也包含了一个兼容层,让你在新的 nftables 内核框架之上运行 iptables 命令。它提供了通用的集合基础允许你建立映射和关联。你可以使用这...

2020-02-03 18:27:21 281

原创 135. 分发糖果

链接题目.难度:high解答:其实就是求每个数左边或者右边连续小于自己的个数。感觉不是很难啊。package mainimport "fmt"func candy(ratings []int) int { if len(ratings) <= 1 { return len(ratings) } candies := make([]int, len(rating...

2020-02-03 14:16:26 131

原创 134. 加油站

链接题目.难度:middle解答:这道题要求环形之中任意两点能否到达,我们可以把环形拉平,数据拉长一倍就能覆盖到所有的情况。所以问题变成了,从a点出发至b点,中间任意一点的剩余油量都是大于等于0,求ab两点之间的最大距离。其实上ab两点可以看做一个window,变成了滑动窗口问题。既然是滑动窗口,那么窗口的伸缩逻辑就成为主要算法了。对于ab窗口,如果长度等于len(gas)那么就已经找到...

2020-02-03 13:56:49 73

原创 一致性哈希

定义一致性哈希是当机器数量增加或者减少的时候,最大限度的减少重新映射的数量。实现hash环我们可以预先定义0-n个bucket,n通常取值2^32-1。为方便我们取值1000对于实际存在的机器数量,假设是3个,我们根据机器的信息,随意hash到某一些bucket,注意不可以指定,分配过程是不可以有状态的,要不然重启就完犊子了,比如对ip做hash。假设分配到的bucket是100, 1...

2020-02-03 12:49:16 79

原创 132. 分割回文串 II

链接题目.难度:high解答:dp用来表示前n个字符串最小需要多少次cut。另外先计算好各个子字符串是否是回文.之前想到过一个dp[i][j]表示是s[i:j+1]最少需要多少次切割。这个思路是对的,但是复杂度变为n**3了,没有利用到最后一次右边的字符串一定是回文的特性。package mainimport "fmt"func minCut(s string) int { ...

2020-02-01 21:45:06 94

原创 131. 分割回文串

链接题目.难度:middle,但我觉得是high解答:这个题咋一看思路很好找,可以用动态规划,计算前n-1长度的子串,然后递推n长度的结果。可是dp一般不适用与这种需要中间结果的,会浪费大量空间。所以用dfs。package mainimport "fmt"type TreeNode struct { Val int Left *TreeNode Right *Tr...

2020-02-01 19:43:37 86

原创 128. 最长连续序列

链接题目.难度:high解答:这个问题没有用到高深的算法,就是对map的应用。算法里,map里面的每个元素只会被标记一次,虽然是嵌套循环,其实最终的复杂度还是线性的package mainimport "fmt"func longestConsecutive(nums []int) int { if len(nums) <= 1 { return len(nums)...

2020-02-01 18:15:12 51

原创 126. 单词接龙 II

链接题目.难度:high解答:这其实就是图的算法,Dijkstra算法这道题,先求直达的最小路径,这个用bfs没啥好说的,一般求路径的问题就是要用dfs,可是不需要求所有的到达路径,也不需要求随意的一条到达路径,不然dfs准没错。所以我们还是要用bfs,不过在bfs的时候,把经过的所有节点都求出从开始到他这儿的路径,看起来好像很浪费空间,不过就这样做确实可以达到目的,不然重构路径确实很...

2020-02-01 01:11:59 152

空空如也

空空如也

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

TA关注的人

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