Skip to content

Commit 5588e50

Browse files
feat: update
1 parent 90bd41b commit 5588e50

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1722
-364
lines changed

README.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,13 @@ this is my blog
2828

2929
## 你可以在以下地方找到我
3030

31-
- [aboutMe](http://wangyaxing.cn/)
31+
- [aboutMe](http://ionestar.cn/)
3232
- [github](https://github.com/funnycoderstar)
3333
- [掘金](https://juejin.im/user/58c6a15544d9040068046025/activities)
3434
- [segmentfault](https://segmentfault.com/u/funnycoderstar)
3535
- [简书](https://www.jianshu.com/u/92fec6da2d1a)
3636
- 微信公众号: 牧码的星星
3737

38-
![牧码的星星](https://cdn.suisuijiang.com/ImageMessage/5adad39555703565e79040fa_1583655092168.png)
39-
4038
## 100 天前端进阶计划
4139

4240
每天一个知识点的原理解析+一道算法题或者一篇一类问题(算法)的总结。

docs/.vuepress/config.js

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ const SortList = GeneratorMenu('/algorithm/排序/', ['冒泡排序', '快速排
1212

1313
const linkList = GeneratorMenu('/algorithm/链表/', [
1414
'合并两个有序链表',
15-
'反转链表',
1615
'回文链表',
1716
'倒数第K个节点',
1817
'找出链表的中间节点',
@@ -94,8 +93,9 @@ module.exports = {
9493
base: '/blog/',
9594
title: '前端学习总结',
9695
description: '前端学习总结',
96+
// plugins: ['autobar'],
9797
// theme: 'vuepress-theme-lemon',
98-
head: [['link', { rel: 'icon', href: 'https://cdn.wangyaxing.cn/icon-128x128.png' }]],
98+
head: [['link', { rel: 'icon', href: 'https://cdn.ionestar.cn/icon-128x128.png' }]],
9999
themeConfig: {
100100
sidebarDepth: 2,
101101
lastUpdated: 'Last Updated',
@@ -132,13 +132,47 @@ module.exports = {
132132
{
133133
title: '链表',
134134
collapsable: true,
135-
children: linkList,
135+
children: [
136+
...linkList,
137+
['/algorithm/链表/反转链表/反转链表', '反转链表'],
138+
['/algorithm/链表/反转链表/92. 反转链表 II', '92. 反转链表 II'],
139+
['/algorithm/链表/反转链表/25. K 个一组翻转链表', '25. K 个一组翻转链表'],
140+
],
141+
},
142+
{
143+
title: '字符串',
144+
collapsable: true,
145+
children: [['/algorithm/字符串/反转字符串', '反转字符串']],
136146
},
137147
{
138148
title: '数组',
139149
collapsable: true,
140150
children: ArrayList,
141151
},
152+
{
153+
title: '优先队列',
154+
collapsable: true,
155+
children: [
156+
[
157+
'/algorithm/优先队列/703. 数据流中的第 K 大元素',
158+
'703. 数据流中的第 K 大元素',
159+
],
160+
['/algorithm/优先队列/滑动窗口的最大值', '滑动窗口的最大值'],
161+
['/algorithm/优先队列/TopK', 'TopK'],
162+
],
163+
},
164+
{
165+
title: '双指针',
166+
collapsable: true,
167+
children: [
168+
[
169+
'/algorithm/优先队列/703. 数据流中的第 K 大元素',
170+
'703. 数据流中的第 K 大元素',
171+
],
172+
['/algorithm/优先队列/滑动窗口的最大值', '滑动窗口的最大值'],
173+
['/algorithm/优先队列/TopK', 'TopK'],
174+
],
175+
},
142176
{
143177
title: '数学',
144178
collapsable: true,
@@ -232,6 +266,7 @@ module.exports = {
232266
['/jsCode/实现一个轮播图', '实现一个轮播图'],
233267
['/jsCode/放大镜效果', '放大镜效果'],
234268
['/jsCode/沙箱', '实现一个沙箱'],
269+
['/jsCode/模版渲染', '模版渲染'],
235270
],
236271
},
237272
],
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
### 剑指 Offer 53 - II. 0 ~ n-1 中缺失的数字
2+
3+
一个长度为 n-1 的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围 0 ~ n-1 之内。在范围 0 ~ n-1 内的 n 个数字中有且只有一个数字不在该数组中,请找出这个数字。
4+
5+
示例 1:
6+
7+
输入: [0,1,3]
8+
输出: 2
9+
示例  2:
10+
11+
输入: [0,1,2,3,4,5,6,7,9]
12+
输出: 8
13+
14+
来源:力扣(LeetCode)
15+
链接:https://leetcode.cn/problems/que-shi-de-shu-zi-lcof
16+
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
17+
18+
### 代码
19+
20+
```js
21+
/**
22+
* @param {number[]} nums
23+
* @return {number}
24+
*/
25+
var missingNumber = function(nums) {
26+
/**
27+
* 使用二分搜索
28+
* 左数组:nums[i] == i
29+
* 右数组:nums[i] !== i
30+
* 结果:找到第一个 nums[i] !== i的 值,即查找左边界
31+
*/
32+
let left = 0;
33+
let right = nums.length - 1;
34+
while (left <= right) {
35+
let mid = Math.floor(left + (right - left) / 2);
36+
if (nums[mid] === mid) {
37+
// [mid + 1, right]区间查找
38+
left = mid + 1;
39+
} else {
40+
right = mid - 1;
41+
}
42+
}
43+
return left;
44+
};
45+
```
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
### 33. 搜索旋转排序数组
2+
3+
整数数组 nums 按升序排列,数组中的值 互不相同 。
4+
5+
在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2]
6+
7+
给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。
8+
9+
示例 1:
10+
11+
输入:nums = [4,5,6,7,0,1,2], target = 0
12+
输出:4
13+
示例 2:
14+
15+
输入:nums = [4,5,6,7,0,1,2], target = 3
16+
输出:-1
17+
示例 3:
18+
19+
输入:nums = [1], target = 0
20+
输出:-1
21+
22+
### 代码
23+
24+
关键词:排序数组,可以使用二分
25+
26+
```js
27+
/**
28+
* @param {number[]} nums
29+
* @param {number} target
30+
* @return {number}
31+
*/
32+
var search = function(nums, target) {
33+
let i = 0;
34+
let j = nums.length - 1;
35+
while (i <= j) {
36+
let mid = Math.floor(i + (j - i) / 2);
37+
if (nums[mid] === target) {
38+
return mid;
39+
}
40+
if (nums[i] === target) {
41+
return i;
42+
}
43+
if (nums[j] === target) {
44+
return j;
45+
}
46+
47+
if (nums[i] < nums[mid]) {
48+
// 说明 i 到mid是有序的
49+
if (nums[i] < target && target < nums[mid]) {
50+
j = mid - 1;
51+
} else {
52+
i = mid + 1;
53+
}
54+
} else {
55+
// mid 到 j有序的
56+
if (nums[mid] < target && target < nums[j]) {
57+
i = mid + 1;
58+
} else {
59+
j = mid - 1;
60+
}
61+
}
62+
}
63+
return -1;
64+
};
65+
```
66+
67+
相似题目:
68+
69+
- [剑指 Offer 11. 旋转数组的最小数字](https://leetcode.cn/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/)
70+
- 「153. 寻找旋转排序数组中的最小值」
71+
- 「154. 寻找旋转排序数组中的最小值 II」

docs/algorithm/其他/二分查找.md renamed to docs/algorithm/二分查找/二分查找.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ function searchLeftBound(arr, target) {
6161
let left = 0;
6262
let right = arr.length - 1;
6363
while (left <= right) {
64-
const mid = Math.floor((left + right) / 2);
64+
let mid = Math.floor(left + (right - left) / 2);
6565
if (arr[mid] === target) {
6666
// 收缩右侧边界
6767
right = mid - 1;
@@ -71,7 +71,7 @@ function searchLeftBound(arr, target) {
7171
right = mid - 1;
7272
}
7373
}
74-
// 检查出界情况
74+
// 检查出界情况,大于右边界或者二不定于target
7575
if (left >= nums.length || nums[left] != target) {
7676
return -1;
7777
}
@@ -107,6 +107,10 @@ function searchRightBound(arr, target) {
107107

108108
- 704. 二分查找
109109
- 34. 在排序数组中查找元素的第一个和最后一个位置
110+
- 剑指 Offer 53 - I. 在排序数组中查找数字 I
111+
- 剑指 Offer 53 - II. 0 ~ n-1 中缺失的数字,
112+
113+
排序数组中的搜索问题,首先想到的是二分查找
110114

111115
## 二分查找的运用
112116

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
### 剑指 Offer 53 - I. 在排序数组中查找数字 I
2+
3+
统计一个数字在排序数组中出现的次数。
4+
5+
示例 1:
6+
7+
输入: nums = [5,7,7,8,8,10], target = 8
8+
输出: 2
9+
示例  2:
10+
11+
输入: nums = [5,7,7,8,8,10], target = 6
12+
输出: 0
13+
14+
来源:力扣(LeetCode)
15+
链接:https://leetcode.cn/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof
16+
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
17+
18+
### 思路解析
19+
20+
关键词:排序数组,可以使用二分查找。
21+
所以该题可以转换为求排序数组的左边界 left,和右边界 right,最后结果为 right - left + 1。
22+
23+
```js
24+
// 寻找左边界
25+
function findTargetLeft(nums, target) {
26+
let left = 0;
27+
let right = nums.length - 1;
28+
while (left <= right) {
29+
let mid = Math.floor(left + (right - left) / 2);
30+
if (nums[mid] === target) {
31+
right = mid - 1;
32+
} else if (nums[mid] < target) {
33+
left = mid + 1;
34+
} else if (nums[mid] > target) {
35+
right = mid - 1;
36+
}
37+
}
38+
// 返回值的处理逻辑,判断是否超出边界
39+
if (left >= nums.length || nums[left] !== target) {
40+
return -1;
41+
}
42+
return left;
43+
}
44+
// 寻找右边界
45+
function findTargetRight(nums, target) {
46+
let left = 0;
47+
let right = nums.length - 1;
48+
while (left <= right) {
49+
let mid = Math.floor(left + (right - left) / 2);
50+
if (nums[mid] === target) {
51+
left = mid + 1;
52+
} else if (nums[mid] < target) {
53+
left = mid + 1;
54+
} else if (nums[mid] > target) {
55+
right = mid - 1;
56+
}
57+
}
58+
// 返回值的处理逻辑,判断是否超出边界
59+
if (right < 0 || nums[right] !== target) {
60+
return -1;
61+
}
62+
return right;
63+
}
64+
/**
65+
* @param {number[]} nums
66+
* @param {number} target
67+
* @return {number}
68+
*/
69+
var search = function(nums, target) {
70+
const left = findTargetLeft(nums, target);
71+
const right = findTargetRight(nums, target);
72+
if (left === -1 && right === -1) {
73+
return 0;
74+
}
75+
return right - left + 1;
76+
};
77+
```
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
## 887. 鸡蛋掉落
2+
3+
给你 k 枚相同的鸡蛋,并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。
4+
5+
已知存在楼层 f ,满足 0 <= f <= n ,任何从 高于 f 的楼层落下的鸡蛋都会碎,从 f 楼层或比它低的楼层落下的鸡蛋都不会破。
6+
7+
每次操作,你可以取一枚没有碎的鸡蛋并把它从任一楼层 x 扔下(满足 1 <= x <= n)。如果鸡蛋碎了,你就不能再次使用它。如果某枚鸡蛋扔下后没有摔碎,则可以在之后的操作中 重复使用 这枚鸡蛋。
8+
9+
请你计算并返回要确定 f 确切的值 的 最小操作次数 是多少?
10+
11+
示例 1:
12+
13+
输入:k = 1, n = 2
14+
输出:2
15+
解释:
16+
鸡蛋从 1 楼掉落。如果它碎了,肯定能得出 f = 0 。
17+
否则,鸡蛋从 2 楼掉落。如果它碎了,肯定能得出 f = 1 。
18+
如果它没碎,那么肯定能得出 f = 2 。
19+
因此,在最坏的情况下我们需要移动 2 次以确定 f 是多少。
20+
示例 2:
21+
22+
输入:k = 2, n = 6
23+
输出:3
24+
25+
## 代码
26+
27+
动态规划+二分查找
28+
29+
```js
30+
/**
31+
* @param {number} k
32+
* @param {number} n
33+
* @return {number}
34+
*/
35+
var superEggDrop = function(k, n) {
36+
// dp[i][j]表示一共j个鸡蛋,从i层扔下去
37+
let dp = new Array(k + 1).fill(0).map(() => new Array(n + 1).fill(0));
38+
let j = 0;
39+
while (dp[k][j] < n) {
40+
j++;
41+
for (let i = 1; i <= k; i++) {
42+
// 状态:dp[i][j] 有i个鸡蛋,j次扔鸡蛋的测得的最多楼层
43+
// 转移方程:dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j] + 1
44+
// dp[i - 1][j - 1] 表示碎了,dp[i - 1][j],表示没碎
45+
dp[i][j] = dp[i][j - 1] + dp[i - 1][j - 1] + 1;
46+
}
47+
}
48+
return j;
49+
};
50+
```
51+
52+
[]()

docs/algorithm/其他/算法题分类.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,25 @@
5050
- 最长公共子序列
5151
- 最长递增子序列
5252
- 编辑距离
53+
54+
算法 - Algorithms
55+
56+
- 排序算法:快速排序、归并排序、计数排序
57+
- 搜索算法:回溯、递归、剪枝技巧
58+
- 图论:最短路、最小生成树、网络流建模
59+
- 动态规划:背包问题、最长子序列、计数问题
60+
- 基础技巧:分治、倍增、二分、贪心
61+
62+
数据结构 - Data Structures
63+
64+
- 数组与链表:单 / 双向链表、跳舞链
65+
- 栈与队列
66+
- 树与图:最近公共祖先、并查集
67+
- 哈希表
68+
- 堆:大 / 小根堆、可并堆
69+
- 字符串:字典树、后缀树
70+
71+
作者:力扣 (LeetCode)
72+
链接:https://leetcode.cn/leetbook/read/top-interview-questions/xm8xw2/
73+
来源:力扣(LeetCode)
74+
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

0 commit comments

Comments
 (0)