<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Monkey-yc]]></title><description><![CDATA[吾志所向，一往无前；愈挫愈勇，再接再厉]]></description><link>https://blog.youkuaiyun.com/yc______</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; yc______]]></copyright><item><title><![CDATA[leetcode-108: 将有序数组转换为二叉搜索树]]></title><link>https://blog.youkuaiyun.com/yc______/article/details/135506584</link><guid>https://blog.youkuaiyun.com/yc______/article/details/135506584</guid><author>yc______</author><pubDate>Wed, 10 Jan 2024 16:19:56 +0800</pubDate><description><![CDATA[给你一个整数数组 nums ，其中元素已经按 升序 排列，请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。]]></description><category></category></item><item><title><![CDATA[六-4:计时器]]></title><link>https://blog.youkuaiyun.com/yc______/article/details/122639028</link><guid>https://blog.youkuaiyun.com/yc______/article/details/122639028</guid><author>yc______</author><pubDate>Sat, 22 Jan 2022 16:11:01 +0800</pubDate><description><![CDATA[一、设计原理
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]]></description><category></category></item><item><title><![CDATA[macos系统里面，蓝牙鼠标偶尔卡顿，飘的问题]]></title><link>https://blog.youkuaiyun.com/yc______/article/details/122302637</link><guid>https://blog.youkuaiyun.com/yc______/article/details/122302637</guid><author>yc______</author><pubDate>Tue, 04 Jan 2022 14:42:50 +0800</pubDate><description><![CDATA[原文地址
无线鼠标总是飘，换了电池也不行
在按以下方法设置之后，暂时没发现问题了。
一，macos里面的设置。
1、左上角，打开系统偏好设置
2、选择网络
3、点左下角的齿轮，选择设定服务顺序


4、将蓝牙PAN拖到第一个

5、点确定，一路应用。

...]]></description><category></category></item><item><title><![CDATA[一致性哈希]]></title><link>https://blog.youkuaiyun.com/yc______/article/details/122260552</link><guid>https://blog.youkuaiyun.com/yc______/article/details/122260552</guid><author>yc______</author><pubDate>Fri, 31 Dec 2021 17:50:28 +0800</pubDate><description><![CDATA[一致性哈希go语言实现]]></description><category></category></item><item><title><![CDATA[六-2: go并发编程]]></title><link>https://blog.youkuaiyun.com/yc______/article/details/121054630</link><guid>https://blog.youkuaiyun.com/yc______/article/details/121054630</guid><author>yc______</author><pubDate>Sat, 30 Oct 2021 18:30:47 +0800</pubDate><description><![CDATA[Mutex
简介

互斥锁，限制临界区同时只能由一个线程持有
Mutex实现了Locker接口，对外提供两个接口，加锁用 Lock(), 退出加锁用 UnLock()
Mutex不用初始化，直接声明就可以使用
Mutex一般可以单独使用，也可以嵌入其他结构中进行封装，对外暴露接口。

实现
type Mutex struct {
	state int32
	sema  uint32
}


演进

初版 使用一个 flag 来表示锁是否被持有，所有 goroutine 进入队列排队执行，先来先得

看似公平]]></description><category></category></item><item><title><![CDATA[leetcode-剑指offer-53-II： 0～n-1中缺失的数字]]></title><link>https://blog.youkuaiyun.com/yc______/article/details/119144739</link><guid>https://blog.youkuaiyun.com/yc______/article/details/119144739</guid><author>yc______</author><pubDate>Tue, 27 Jul 2021 15:20:10 +0800</pubDate><description><![CDATA[题目描述
一个长度为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]]></description><category></category></item><item><title><![CDATA[leetcode-剑指offer-58：反转单词顺序]]></title><link>https://blog.youkuaiyun.com/yc______/article/details/118740319</link><guid>https://blog.youkuaiyun.com/yc______/article/details/118740319</guid><author>yc______</author><pubDate>Thu, 15 Jul 2021 00:05:25 +0800</pubDate><description><![CDATA[题目描述
输入一个英文句子，翻转句子中单词的顺序，但单词内字符的顺序不变。为简单起见，标点符号和普通字母一样处理。例如输入字符串"I am a student. “，则输出"student. a am I”。
示例 1：
输入: “the sky is blue”
输出: “blue is sky the”
示例 2：
输入: "  hello world!  "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格，但是反转后的字符不能包括。
示例 3：
输入: “a ]]></description><category></category></item><item><title><![CDATA[leetcode-剑指offer-65：二进制实现加法]]></title><link>https://blog.youkuaiyun.com/yc______/article/details/118740091</link><guid>https://blog.youkuaiyun.com/yc______/article/details/118740091</guid><author>yc______</author><pubDate>Wed, 14 Jul 2021 23:36:11 +0800</pubDate><description><![CDATA[题目描述
写一个函数，求两个整数之和，要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
示例:
输入: 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 &amp; ]]></description><category></category></item><item><title><![CDATA[leetcode-剑指offer-53： 在排序数组中查找数字 I]]></title><link>https://blog.youkuaiyun.com/yc______/article/details/118717616</link><guid>https://blog.youkuaiyun.com/yc______/article/details/118717616</guid><author>yc______</author><pubDate>Wed, 14 Jul 2021 02:11:39 +0800</pubDate><description><![CDATA[题目描述
统计一个数字在排序数组中出现的次数。
示例 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]]></description><category></category></item><item><title><![CDATA[leetcode-78：子集]]></title><link>https://blog.youkuaiyun.com/yc______/article/details/118716123</link><guid>https://blog.youkuaiyun.com/yc______/article/details/118716123</guid><author>yc______</author><pubDate>Wed, 14 Jul 2021 01:35:22 +0800</pubDate><description><![CDATA[题目描述
给你一个整数数组 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每个数的二进制位表示一个子集]]></description><category></category></item><item><title><![CDATA[leetcode-198：打家劫舍]]></title><link>https://blog.youkuaiyun.com/yc______/article/details/118677412</link><guid>https://blog.youkuaiyun.com/yc______/article/details/118677412</guid><author>yc______</author><pubDate>Mon, 12 Jul 2021 16:09:19 +0800</pubDate><description><![CDATA[题目描述
你是一个专业的小偷，计划偷窃沿街的房屋。每间房内都藏有一定的现金，影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统，如果两间相邻的房屋在同一晚上被小偷闯入，系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组，计算你 不触动警报装置的情况下 ，一夜之内能够偷窃到的最高金额。
示例 1：
输入：[1,2,3,1]
输出：4
解释：偷窃 1 号房屋 (金额 = 1) ，然后偷窃 3 号房屋 (金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。
示例 2：
输入：[2,7]]></description><category></category></item><item><title><![CDATA[leetcode-55：跳跃游戏]]></title><link>https://blog.youkuaiyun.com/yc______/article/details/118677299</link><guid>https://blog.youkuaiyun.com/yc______/article/details/118677299</guid><author>yc______</author><pubDate>Mon, 12 Jul 2021 16:04:18 +0800</pubDate><description><![CDATA[题目描述
给定一个非负整数数组 nums ，你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
示例 1：
输入：nums = [2,3,1,1,4]
输出：true
解释：可以先跳 1 步，从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
示例 2：
输入：nums = [3,2,1,0,4]
输出：false
解释：无论怎样，总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 ， 所以永远不可能到达最后一]]></description><category></category></item><item><title><![CDATA[MySQL学习笔记：实战篇]]></title><link>https://blog.youkuaiyun.com/yc______/article/details/118191141</link><guid>https://blog.youkuaiyun.com/yc______/article/details/118191141</guid><author>yc______</author><pubDate>Mon, 12 Jul 2021 14:09:28 +0800</pubDate><description><![CDATA[唯一索引和普通索引的区别


change buffer ：更新记录时，如果该数据页在内存中，则直接更新。否则写入 change buffer。

等到下次查询访问该数据页时，再执行 change buffer来保正数据逻辑正确。
后台线程会定期merge change buffer 的内容到数据页
数据库正常关闭时也会merge
适用于普通索引。在写多读少的场景下更优



查询过程：一般来说两者没多大性能差别

唯一索引具有唯一性，查询到第一个满足的记录后就会停止检索
普通索引找到第一个记录后，还需要向]]></description><category></category></item><item><title><![CDATA[leetcode-剑指offer-52：两个链表的第一个公共节点]]></title><link>https://blog.youkuaiyun.com/yc______/article/details/118672875</link><guid>https://blog.youkuaiyun.com/yc______/article/details/118672875</guid><author>yc______</author><pubDate>Mon, 12 Jul 2021 13:20:49 +0800</pubDate><description><![CDATA[题目描述
输入两个链表，找出它们的第一个公共节点。

解题思路

双指针法。
a走完再走b，b走完再走a，这样两个链表所走一样长，且在第一个公共节点停止

代码实现
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func getIntersectionNode(headA, headB *ListNode) *ListNode ]]></description><category></category></item><item><title><![CDATA[leetcode-剑指offer-50：第一个只出现一次的字符]]></title><link>https://blog.youkuaiyun.com/yc______/article/details/118672729</link><guid>https://blog.youkuaiyun.com/yc______/article/details/118672729</guid><author>yc______</author><pubDate>Mon, 12 Jul 2021 12:57:17 +0800</pubDate><description><![CDATA[题目描述
在字符串 s 中找出第一个只出现一次的字符。如果没有，返回一个单空格。 s 只包含小写字母。
示例:
s = “abaccdeff”
返回 “b”
s = “”
返回 " "
解题思路

用数组记录每个字符出现的次数
寻找只出现过一次的字符返回

算法复杂度

时间复杂度 O(N)
空间复杂度 O(1)

代码实现
func firstUniqChar(s string) byte {
    count := make([]int, 26)

    for _, c := range s {
]]></description><category></category></item><item><title><![CDATA[leetcode-剑指offer-42：连续子数组的最大和]]></title><link>https://blog.youkuaiyun.com/yc______/article/details/118672589</link><guid>https://blog.youkuaiyun.com/yc______/article/details/118672589</guid><author>yc______</author><pubDate>Mon, 12 Jul 2021 12:38:29 +0800</pubDate><description><![CDATA[题目描述
解题思路

动态规划
如果前边值对当前为负增益，舍弃。如果为增益，加上
一直记录dp数组中的最大值，遍历完即可得到连续子数组的最大和
可以用原数组来维护dp数组

算法复杂度

时间复杂度：O(N)
空间复杂度：O(1)

代码实现
func maxSubArray(nums []int) int {
    if len(nums) &lt;= 0 {
        return 0
    }

    res := nums[0]
    for i := 1; i &lt; len(nu]]></description><category></category></item><item><title><![CDATA[leetcode-剑指offer-40：最小的k个数]]></title><link>https://blog.youkuaiyun.com/yc______/article/details/118664011</link><guid>https://blog.youkuaiyun.com/yc______/article/details/118664011</guid><author>yc______</author><pubDate>Mon, 12 Jul 2021 01:18:35 +0800</pubDate><description><![CDATA[题目描述
输入整数数组 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]
方法一：快排
解题思路

快排，找基准。然后从右边找一个比基准大的，从左边找一个比基准小的。交换。基准和小的交换。这样就将数组以基准分为两部分，递归处理这两部分（分治）
注意先从右边找，再从]]></description><category></category></item><item><title><![CDATA[leetcode-剑指offer-39：数组中出现次数超过一半的数字]]></title><link>https://blog.youkuaiyun.com/yc______/article/details/118655839</link><guid>https://blog.youkuaiyun.com/yc______/article/details/118655839</guid><author>yc______</author><pubDate>Sun, 11 Jul 2021 16:26:19 +0800</pubDate><description><![CDATA[题目描述
数组中有一个数字出现的次数超过数组长度的一半，请找出这个数字。
你可以假设数组是非空的，并且给定的数组总是存在多数元素。
示例 1:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2
解题思路

投票法
随机假设一个众数，遍历数组，如果和众数相同，则加一票，不同则减一票
因为该数组出现次数超过一半以上，因此最终投票留下的众数就是该数

代码实现
func majorityElement(nums []int) int {
    // 假设的众数
    x := 0

]]></description><category></category></item><item><title><![CDATA[leetcode-剑指offer-29：顺时针打印矩阵]]></title><link>https://blog.youkuaiyun.com/yc______/article/details/118655317</link><guid>https://blog.youkuaiyun.com/yc______/article/details/118655317</guid><author>yc______</author><pubDate>Sun, 11 Jul 2021 15:56:45 +0800</pubDate><description><![CDATA[题目描述
输入一个矩阵，按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 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]]></description><category></category></item><item><title><![CDATA[leetcode-剑指offer-32-II：从上到下打印二叉树 II]]></title><link>https://blog.youkuaiyun.com/yc______/article/details/118654781</link><guid>https://blog.youkuaiyun.com/yc______/article/details/118654781</guid><author>yc______</author><pubDate>Sun, 11 Jul 2021 15:20:33 +0800</pubDate><description><![CDATA[题目描述
从上到下按层打印二叉树，同一层的节点按从左到右的顺序打印，每一层打印到一行。
例如:
给定二叉树: [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]]></description><category></category></item></channel></rss>