- 博客(175)
- 收藏
- 关注
原创 leetcode-108: 将有序数组转换为二叉搜索树
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
2024-01-10 16:19:56
460
2
原创 六-4:计时器
一、设计原理Go语言的定时器经历过很多个版本迭代Go 1.9版本之前,使用全局唯一的四叉堆维护Go 1.10-1.13,全局使用64个四叉堆,每个处理器(P)对应一个四叉堆Go 1.14版本之后,每个处理器P直接管理一个四叉堆,通过网络轮询器触发1. 全局四叉堆所有的计时器都会存储在如下结构中var timers struct { lock mutex gp *g created bool sleeping bool resc
2022-01-22 16:11:01
831
转载 macos系统里面,蓝牙鼠标偶尔卡顿,飘的问题
原文地址无线鼠标总是飘,换了电池也不行在按以下方法设置之后,暂时没发现问题了。一,macos里面的设置。1、左上角,打开系统偏好设置2、选择网络3、点左下角的齿轮,选择设定服务顺序4、将蓝牙PAN拖到第一个5、点确定,一路应用。...
2022-01-04 14:42:50
9203
3
原创 六-2: go并发编程
Mutex简介互斥锁,限制临界区同时只能由一个线程持有Mutex实现了Locker接口,对外提供两个接口,加锁用 Lock(), 退出加锁用 UnLock()Mutex不用初始化,直接声明就可以使用Mutex一般可以单独使用,也可以嵌入其他结构中进行封装,对外暴露接口。实现type Mutex struct { state int32 sema uint32}演进初版 使用一个 flag 来表示锁是否被持有,所有 goroutine 进入队列排队执行,先来先得看似公平
2021-10-30 18:30:47
199
原创 leetcode-剑指offer-53-II: 0~n-1中缺失的数字
题目描述一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。示例 1:输入: [0,1,3]输出: 2示例 2:输入: [0,1,2,3,4,5,6,7,9]输出: 8解题思路排序数组的搜索首先考虑二分查找如果左边下标和元素能对应上,说明往左都有序。左边指针移动如果右边对应不上,说明右边乱序,右边指针向左移动,寻找第一个乱序的下标,即为所有元素代码实现func mi
2021-07-27 15:20:10
203
原创 leetcode-剑指offer-58:反转单词顺序
题目描述输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。示例 1:输入: “the sky is blue”输出: “blue is sky the”示例 2:输入: " hello world! "输出: “world! hello”解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例 3:输入: “a
2021-07-15 00:05:25
230
1
原创 leetcode-剑指offer-65:二进制实现加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。示例:输入: a = 1, b = 1输出: 2解题思路使用二进制s = a + b = n + c;c为进位和,n为非进位和异或操作可得到非进位和,相与并左移一位可得到进位和代码实现func add(a int, b int) int { // 进位为0跳出循环 for b != 0 { // 进位和 c := (a &
2021-07-14 23:36:11
212
原创 leetcode-剑指offer-53: 在排序数组中查找数字 I
题目描述统计一个数字在排序数组中出现的次数。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: 2示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: 0解题思路二分查找。通过处理等于的情况,查找左右边界,下边相减即为出现次数右边界:等于的时候,左指针继续向右移左边界:等于的时候,右指针继续向左移左右都会超出目标值一位,最后结果要减去一代码实现func search(nums []int, tar
2021-07-14 02:11:39
124
原创 leetcode-78:子集
题目描述给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例 1:输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例 2:输入:nums = [0]输出:[[],[0]]方法一:二进制位表示解题思路利用二进制来表示,长度为n的数组全组合的子集数量是2^n-1个元素从0到2^n-1每个数的二进制位表示一个子集
2021-07-14 01:35:22
141
原创 leetcode-198:打家劫舍
题目描述你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。示例 2:输入:[2,7
2021-07-12 16:09:19
109
原创 leetcode-55:跳跃游戏
题目描述给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例 1:输入:nums = [2,3,1,1,4]输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。示例 2:输入:nums = [3,2,1,0,4]输出:false解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一
2021-07-12 16:04:18
197
原创 MySQL学习笔记:实战篇
唯一索引和普通索引的区别change buffer :更新记录时,如果该数据页在内存中,则直接更新。否则写入 change buffer。等到下次查询访问该数据页时,再执行 change buffer来保正数据逻辑正确。后台线程会定期merge change buffer 的内容到数据页数据库正常关闭时也会merge适用于普通索引。在写多读少的场景下更优查询过程:一般来说两者没多大性能差别唯一索引具有唯一性,查询到第一个满足的记录后就会停止检索普通索引找到第一个记录后,还需要向
2021-07-12 14:09:28
112
原创 leetcode-剑指offer-52:两个链表的第一个公共节点
题目描述输入两个链表,找出它们的第一个公共节点。解题思路双指针法。a走完再走b,b走完再走a,这样两个链表所走一样长,且在第一个公共节点停止代码实现/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */func getIntersectionNode(headA, headB *ListNode) *ListNode
2021-07-12 13:20:49
116
原创 leetcode-剑指offer-50:第一个只出现一次的字符
题目描述在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。示例:s = “abaccdeff”返回 “b”s = “”返回 " "解题思路用数组记录每个字符出现的次数寻找只出现过一次的字符返回算法复杂度时间复杂度 O(N)空间复杂度 O(1)代码实现func firstUniqChar(s string) byte { count := make([]int, 26) for _, c := range s {
2021-07-12 12:57:17
121
原创 leetcode-剑指offer-42:连续子数组的最大和
题目描述解题思路动态规划如果前边值对当前为负增益,舍弃。如果为增益,加上一直记录dp数组中的最大值,遍历完即可得到连续子数组的最大和可以用原数组来维护dp数组算法复杂度时间复杂度:O(N)空间复杂度:O(1)代码实现func maxSubArray(nums []int) int { if len(nums) <= 0 { return 0 } res := nums[0] for i := 1; i < len(nu
2021-07-12 12:38:29
144
原创 leetcode-剑指offer-40:最小的k个数
题目描述输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。示例 1:输入:arr = [3,2,1], k = 2输出:[1,2] 或者 [2,1]示例 2:输入:arr = [0,1,2,1], k = 1输出:[0]方法一:快排解题思路快排,找基准。然后从右边找一个比基准大的,从左边找一个比基准小的。交换。基准和小的交换。这样就将数组以基准分为两部分,递归处理这两部分(分治)注意先从右边找,再从
2021-07-12 01:18:35
196
原创 leetcode-剑指offer-39:数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2解题思路投票法随机假设一个众数,遍历数组,如果和众数相同,则加一票,不同则减一票因为该数组出现次数超过一半以上,因此最终投票留下的众数就是该数代码实现func majorityElement(nums []int) int { // 假设的众数 x := 0
2021-07-11 16:26:19
126
原创 leetcode-剑指offer-29:顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]解题思路定义上下左右四个边界,按顺序循环打印注意判断结束条件,四个边界某两个相遇时即结束代码实现func spiralOr
2021-07-11 15:56:45
146
原创 leetcode-剑指offer-32-II:从上到下打印二叉树 II
题目描述从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。例如:给定二叉树: [3,9,20,null,null,15,7],3/ 9 20/ 15 7返回其层次遍历结果:[[3],[9,20],[15,7]]解题思路利用队列进行层序遍历每层再进行遍历,一次处理一层数据。将结果保存在二维数组中,将子节点添加进队列代码实现/** * Definition for a binary tree node. * type TreeNo
2021-07-11 15:20:33
163
原创 leetcode-剑指offer-30:最小栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。解题思路使用两个栈来实现一个栈正常保存数值,入栈出栈另一个栈保存当前栈内最小值,入栈时将当前最小值和入栈元素比较,小者入栈出栈时两个栈同时出栈代码实现type MinStack struct { stack []int minStack []int}/** initialize your data struc
2021-07-11 14:12:10
124
原创 leetcode-剑指offer-28:对称的二叉树
题目描述请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。1/ 2 2/ \ / 3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:1/ 2 2\ 3 3示例 1:输入:root = [1,2,2,3,4,4,3]输出:true示例 2:输入:root = [1,2,2,null,3,null,3]输出:f
2021-07-11 13:49:45
113
原创 leetcode-剑指offer-27:二叉树的镜像
题目描述请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如输入:4/ 2 7/ \ / 1 3 6 9镜像输出:4/ 7 2/ \ / 9 6 3 1示例 1:输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]方法一:递归解题思路处理当前节点,交换左右子节点递归分别处理左子树和右子树代码实现/** * Definition for a binary tree node.
2021-07-11 13:39:09
157
原创 leetcode-剑指offer-25:合并两个有序链表
题目描述输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4解题思路新建一个链表头遍历两个链表,直到某个到头。按大小将两个链表的节点添加在新链表之后遍历完,检查两个链表剩余的元素代码实现/** * Definition for singly-linked list. * type ListNode struct { *
2021-07-10 15:42:20
152
原创 leetcode-剑指offer-24:反转链表
题目描述定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL方法一:迭代解题思路利用链表的头插法挨着遍历原链表,头插到新链表代码实现/** * Definition for singly-linked list. * type ListNode struct { * Val int *
2021-07-10 15:31:48
300
原创 leetcode-剑指offer-22:链表中倒数第k个节点
题目描述输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5解题思路双指针法复制一个链表出来,第一个链表走k个节点然后两个链表一起开始走,直到第一个链表走完此时第二个链表当前节点
2021-07-10 15:14:55
250
原创 leetcode-剑指offer-21: 调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。示例:输入:nums = [1,2,3,4]输出:[1,3,2,4]注:[3,1,2,4] 也是正确的答案之一。解题思路双指针法,头尾各一个指针头指针寻到奇数则继续,直到偶数尾指针寻到偶数则继续,直到奇数头偶尾奇交换,然后继续直到头尾指针相遇代码实现func exchange(nums []int) []int { left := 0 ri
2021-07-10 15:04:59
67
原创 leetcode-剑指offer-18:删除链表的节点
题目描述给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。注意:此题对比原题有改动示例 1:输入: head = [4,5,1,9], val = 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.示例 2:输入: head = [4,5,1,9], val = 1输出: [4,5,9]解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数
2021-07-10 14:43:30
135
原创 leetcode-剑指offer-17:打印从1到最大的n位数
题目描述输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。示例 1:输入: n = 1输出: [1,2,3,4,5,6,7,8,9]解题思路不考虑大数的情况最大的n位数等于10的n次方减一然后遍历打印即可代码实现func printNumbers(n int) []int { res := make([]int, 0) max := 1 for i := 0; i < n; i
2021-07-09 16:03:00
156
原创 leetcode-剑指offer-15:二进制中1的个数
题目描述编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。方法一:位运算解题思路遍历,右移,如果最后一位是1,计数加一代码实现func hammingWeight(num uint32) int { res := 0 for i := 0; i <= 32; i++ { if (num&1) == 1 { res++ }
2021-07-09 15:37:14
191
原创 leetcode-剑指offer-11:旋转数组的最小值
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。示例 1:输入:[3,4,5,1,2]输出:1示例 2:输入:[2,2,2,0,1]输出:0方法一:遍历算法复杂度O(N)解题思路遍历数组,当前元素如果小于下一个元素,继续遍历当前元素如果大于下一个元素,则下一个元素就是最小值遍历完还没有找到,则返回第一
2021-07-09 15:19:59
78
原创 Redis:布隆过滤器
作用:预防缓存穿透服务器接口遭到恶意攻击,大量查询缓存中没有的数据,流量打到数据库,造成数据库故障。布隆过滤器布隆过滤器就是一个n位的二进制数组,利用多组哈希,将数据库中存在的数据在二进制数组中映射出来。每组哈希会得到二进制数组的一个下标,所有下标都为1,则该数据可能存在,否则一定不存在。请求过来,先进行哈希,去布隆过滤器验证该数据是否存在,这样可以在缓存层避免掉绝大部分穿透查询。布隆过滤器存在误差。因为每个二进制位表示多个数据,因此,可以通过增加数组长度或者增加哈希次数来减小误差,但同时会带来
2021-07-09 13:06:47
197
原创 试题广场:二叉树所有路径和
题目描述给定一个仅包含数字\ 0-9 0−9 的二叉树,每一条从根节点到叶子节点的路径都可以用一个数字表示。例如根节点到叶子节点的一条路径是1\to 2\to 31→2→3,那么这条路径就用\ 123 123 来代替。找出根节点到叶子节点的所有路径表示的数字之和例如:这颗二叉树一共有两条路径,根节点到叶子节点的路径 1-> 2 用数字 12 代替根节点到叶子节点的路径 1→3 用数字13 代替所以答案为 12+13=25解题思路前序遍历,上层的值乘10,加上当前节点的值,为目前
2021-06-24 22:29:23
149
3
原创 leetcode-257:二叉树的所有路径
题目描述给定一个二叉树,返回所有从根节点到叶子节点的路径。说明: 叶子节点是指没有子节点的节点。示例:输入:1/ 2 35输出: [“1->2->5”, “1->3”]解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3解题思路前序遍历,每一层保存该层节点如果遇到叶子节点就将该路径保存并回溯传入数组指针用来保存最终结果代码实现/** * Definition for a binary tree node.
2021-06-24 22:07:35
98
原创 mysql学习笔记:基础架构
一条查询SQL的执行连接器执行命令链接数据库。注意事项mysql临时使用的资源保存在连接对象中,大量使用长连接会导致数据库oom,表现为mysql异常重启。解决定期断开;执行占内存的大查询后断开5.7版本之后,使用reset命令可以重置连接道初始化状态查询缓存建立好连接,执行select语句会先查询缓存。如果之前执行过该语句,直接命中缓存,返回,效率很高大多数时候缓存都是关闭的。mysql在表数据有更新时就会清空缓存,所以大多数时候缓存没啥用。除非长时间不会更新的表,才适合用
2021-06-23 23:50:06
128
2
原创 算法:排序:堆排序
题目描述堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。算法复杂度堆排序为不稳定排序最好,最差,平均时间复杂度都为O(nlogn)解题思路构建大顶堆或者小顶堆将数列中元素挨着放到堆顶,然后平衡该堆最终得到排好序的堆升序或降序的区别就是平衡堆时的判断条件是大于还是小于代码实现func heapSort(arr []int) []int { buildHea
2021-06-19 17:44:29
72
原创 算法:排序:归并排序
题目描述归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。解题思路将一个数组分为两份,分别排序,然后合并两个有序数组。递归对分割的数组再次进行分割,直到数组中只剩一个元素合并的时候按大小进行顺序合并即可代码实现func mergeSort(arr []int) []int { le
2021-06-19 16:51:22
74
原创 leetcode-剑指offer-62:约瑟夫环
题目描述0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。示例 1:输入: n = 5, m = 3输出: 3示例 2:输入: n = 10, m = 17输出: 2方法一:暴力解解题思路维护链表,迭代进行删除,直至最后一个节点注意迭代
2021-06-18 17:23:13
474
原创 算法:排序:插入排序
题目描述插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。算法复杂度插入排序为稳定排序平均复杂度为O(n²)最坏复杂度为O(n²)最好复杂度为O(n)解题思路挨着遍历数列,前边为排好得,后边为未排的取到一个未排序的数,和前一个数比较,前一个数大,将前一个数向后移一位直到前一个数不大于当前未排序的数,将该数插入当前位置重复该步骤n-1次,将全部数归位代码实现f
2021-06-10 21:11:45
156
原创 算法:排序:选择排序
题目描述选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。算法复杂度选择算法不稳定最好最坏平均时间复杂度都是O(n²)解题思路默认第一个元素最小,和其他元素做对比,找到最小的,和第一个元素替换除过第一个,找其他元素中最小的,和第二个元素替换以此类推,经过n - 1次排序完成代码实现f
2021-06-10 17:43:06
81
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人