Compare commits
11 Commits
ed223c4b54
...
master
Author | SHA1 | Date | |
---|---|---|---|
20f821a921 | |||
2e60e7aa98 | |||
69986d68fd | |||
7f6439ce7c | |||
41aa639602 | |||
146b33a651 | |||
450f1f6b5d | |||
89d8ac5e58 | |||
16ec46e003 | |||
3115552b87 | |||
cc5208bda0 |
3
.github/workflows/nodejs.yml
vendored
3
.github/workflows/nodejs.yml
vendored
@ -11,12 +11,11 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
node-version: [10.x, 12.x]
|
node-version: [12.x, 14.x]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
15
.vscode/settings.json
vendored
15
.vscode/settings.json
vendored
@ -19,6 +19,7 @@
|
|||||||
"lcov",
|
"lcov",
|
||||||
"leetcode",
|
"leetcode",
|
||||||
"leetcodeisgreat",
|
"leetcodeisgreat",
|
||||||
|
"liang",
|
||||||
"lrloseumgh",
|
"lrloseumgh",
|
||||||
"mincost",
|
"mincost",
|
||||||
"nums",
|
"nums",
|
||||||
@ -32,7 +33,19 @@
|
|||||||
"subarrays",
|
"subarrays",
|
||||||
"umghlrlose",
|
"umghlrlose",
|
||||||
"xuan",
|
"xuan",
|
||||||
|
"zhan",
|
||||||
"zhong",
|
"zhong",
|
||||||
"zhuan"
|
"zhuan"
|
||||||
]
|
],
|
||||||
|
"standard.options": {
|
||||||
|
"globals": [
|
||||||
|
"$",
|
||||||
|
"jQuery",
|
||||||
|
"fetch"
|
||||||
|
],
|
||||||
|
"usePackageJson": true,
|
||||||
|
"env": {
|
||||||
|
"jest": true
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
23
README.md
23
README.md
@ -376,6 +376,16 @@ LeetCode 与 LintCode 解题记录。此为个人练习仓库,代码中对重
|
|||||||
- LeetCode 739. 每日温度 <https://leetcode-cn.com/problems/daily-temperatures/>
|
- LeetCode 739. 每日温度 <https://leetcode-cn.com/problems/daily-temperatures/>
|
||||||
- LintCode 1060. 每日温度 <https://www.lintcode.com/problem/daily-temperatures/description>
|
- LintCode 1060. 每日温度 <https://www.lintcode.com/problem/daily-temperatures/description>
|
||||||
|
|
||||||
|
- [最长重复子数组](src/array/maximum-length-of-repeated-subarray.js)
|
||||||
|
|
||||||
|
- LeetCode 718. 最长重复子数组 <https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray/>
|
||||||
|
- LintCode 79. 最长公共子串 <https://www.lintcode.com/problem/longest-common-substring/description>
|
||||||
|
|
||||||
|
- [有序矩阵中第 K 小的元素](src/array/kth-smallest-element-in-a-sorted-matrix.js)
|
||||||
|
|
||||||
|
- LeetCode 378. 有序矩阵中第 K 小的元素 <https://leetcode-cn.com/problems/kth-smallest-element-in-a-sorted-matrix/>
|
||||||
|
- LintCode 401. 排序矩阵中的从小到大第 k 个数 <https://www.lintcode.com/problem/kth-smallest-number-in-sorted-matrix/description>
|
||||||
|
|
||||||
## 栈
|
## 栈
|
||||||
|
|
||||||
- [最大矩阵](src/stack/maximal-rectangle.js)
|
- [最大矩阵](src/stack/maximal-rectangle.js)
|
||||||
@ -388,6 +398,10 @@ LeetCode 与 LintCode 解题记录。此为个人练习仓库,代码中对重
|
|||||||
- LeetCode 155. 最小栈 <https://leetcode-cn.com/problems/min-stack/>
|
- LeetCode 155. 最小栈 <https://leetcode-cn.com/problems/min-stack/>
|
||||||
- LintCode 12. 带最小值操作的栈 <https://www.lintcode.com/problem/min-stack/description>
|
- LintCode 12. 带最小值操作的栈 <https://www.lintcode.com/problem/min-stack/description>
|
||||||
|
|
||||||
|
- [用两个栈实现队列](src/stack/yong-liang-ge-zhan-shi-xian-dui-lie-lcof.js)
|
||||||
|
|
||||||
|
- LeetCode 剑指 Offer 09. 用两个栈实现队列 <https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/>
|
||||||
|
|
||||||
- [字符串解码](src/stack/decode-string.js)
|
- [字符串解码](src/stack/decode-string.js)
|
||||||
|
|
||||||
- LeetCode 394. 字符串解码 <https://leetcode-cn.com/problems/decode-string/>
|
- LeetCode 394. 字符串解码 <https://leetcode-cn.com/problems/decode-string/>
|
||||||
@ -497,6 +511,15 @@ LeetCode 与 LintCode 解题记录。此为个人练习仓库,代码中对重
|
|||||||
- LeetCode 105. 从前序与中序遍历序列构造二叉树 <https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/>
|
- LeetCode 105. 从前序与中序遍历序列构造二叉树 <https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/>
|
||||||
- LintCode 73. 前序遍历和中序遍历树构造二叉树 <https://www.lintcode.com/problem/construct-binary-tree-from-preorder-and-inorder-traversal/description>
|
- LintCode 73. 前序遍历和中序遍历树构造二叉树 <https://www.lintcode.com/problem/construct-binary-tree-from-preorder-and-inorder-traversal/description>
|
||||||
|
|
||||||
|
- [将有序数组转换为二叉搜索树](src/tree/convert-sorted-array-to-binary-search-tree.js)
|
||||||
|
|
||||||
|
- LeetCode 108. 将有序数组转换为二叉搜索树 <https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/>
|
||||||
|
- LintCode 106. 有序链表转换为二叉搜索树 <https://www.lintcode.com/problem/convert-sorted-list-to-binary-search-tree/description>
|
||||||
|
|
||||||
|
- [不同的二叉搜索树](src/tree/unique-binary-search-trees.js)
|
||||||
|
|
||||||
|
- LeetCode 96. 不同的二叉搜索树 <https://leetcode-cn.com/problems/unique-binary-search-trees/>
|
||||||
|
|
||||||
## 链表
|
## 链表
|
||||||
|
|
||||||
- [合并 K 个排序链表](src/list/merge-k-sorted-lists.js)
|
- [合并 K 个排序链表](src/list/merge-k-sorted-lists.js)
|
||||||
|
8
src/array/kth-smallest-element-in-a-sorted-matrix.js
Normal file
8
src/array/kth-smallest-element-in-a-sorted-matrix.js
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
/**
|
||||||
|
* @param {number[][]} matrix
|
||||||
|
* @param {number} k
|
||||||
|
* @return {number}
|
||||||
|
*/
|
||||||
|
export const kthSmallest = function (matrix, k) {
|
||||||
|
return matrix.flat().sort((a, b) => a - b)[k - 1]
|
||||||
|
}
|
38
src/array/maximum-length-of-repeated-subarray.js
Normal file
38
src/array/maximum-length-of-repeated-subarray.js
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
// 输入:
|
||||||
|
// A: [1, 2, 3, 2, 1]
|
||||||
|
// B: [3, 2, 1, 4, 7]
|
||||||
|
|
||||||
|
const maxLength = function (A, B, addA, addB, len) {
|
||||||
|
addA = (addA > 0) ? addA : 0
|
||||||
|
addB = (addB > 0) ? addB : 0
|
||||||
|
let result = 0
|
||||||
|
let k = 0
|
||||||
|
for (let i = 0; i < len && (k + len - i > result); i++) {
|
||||||
|
if (A[i + addA] === B[i + addB]) {
|
||||||
|
k++
|
||||||
|
} else {
|
||||||
|
k = 0
|
||||||
|
}
|
||||||
|
result = Math.max(result, k)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {number[]} A
|
||||||
|
* @param {number[]} B
|
||||||
|
* @return {number}
|
||||||
|
*/
|
||||||
|
export const findLength = function (A, B) {
|
||||||
|
const ALen = A.length
|
||||||
|
const BLen = B.length
|
||||||
|
let result = 0
|
||||||
|
for (let i = 1; i < ALen + BLen; i++) {
|
||||||
|
if (result >= (ALen + BLen - i)) {
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
const len = Math.min(i, ALen, BLen, (ALen + BLen - i))
|
||||||
|
result = Math.max(maxLength(A, B, ALen - i, i - ALen, len), result)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
37
src/stack/yong-liang-ge-zhan-shi-xian-dui-lie-lcof.js
Normal file
37
src/stack/yong-liang-ge-zhan-shi-xian-dui-lie-lcof.js
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
export var CQueue = function () {
|
||||||
|
this.stackA = []
|
||||||
|
this.stackB = []
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {number} value
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
CQueue.prototype.appendTail = function (value) {
|
||||||
|
this.stackA.push(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return {number}
|
||||||
|
*/
|
||||||
|
CQueue.prototype.deleteHead = function () {
|
||||||
|
const stackBNum = this.stackB.length
|
||||||
|
|
||||||
|
while (this.stackA.length) {
|
||||||
|
this.stackB.push(this.stackA.pop())
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stackBNum !== 0) {
|
||||||
|
this.stackB.push(...this.stackB.splice(0, stackBNum))
|
||||||
|
}
|
||||||
|
|
||||||
|
const tmp = this.stackB.pop()
|
||||||
|
return tmp === undefined ? -1 : tmp
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Your CQueue object will be instantiated and called as such:
|
||||||
|
* var obj = new CQueue()
|
||||||
|
* obj.appendTail(value)
|
||||||
|
* var param_2 = obj.deleteHead()
|
||||||
|
*/
|
20
src/tree/convert-sorted-array-to-binary-search-tree.js
Normal file
20
src/tree/convert-sorted-array-to-binary-search-tree.js
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import TreeNode from '../../test/tree/TreeNode'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {number[]} nums
|
||||||
|
* @return {TreeNode}
|
||||||
|
*/
|
||||||
|
export const sortedArrayToBST = function (nums) {
|
||||||
|
if (!nums.length) return null
|
||||||
|
|
||||||
|
const creatTree = (left, right) => {
|
||||||
|
if (left > right) return null
|
||||||
|
const mid = Math.floor((left + right) / 2)
|
||||||
|
const root = new TreeNode(nums[mid])
|
||||||
|
root.left = creatTree(left, mid - 1)
|
||||||
|
root.right = creatTree(mid + 1, right)
|
||||||
|
return root
|
||||||
|
}
|
||||||
|
|
||||||
|
return creatTree(0, nums.length - 1)
|
||||||
|
}
|
12
src/tree/unique-binary-search-trees.js
Normal file
12
src/tree/unique-binary-search-trees.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
// 卡塔兰数
|
||||||
|
/**
|
||||||
|
* @param {number} n
|
||||||
|
* @return {number}
|
||||||
|
*/
|
||||||
|
export const numTrees = function (n) {
|
||||||
|
let C = 1
|
||||||
|
for (let i = 0; i < n; ++i) {
|
||||||
|
C = C * 2 * (2 * i + 1) / (i + 2)
|
||||||
|
}
|
||||||
|
return C
|
||||||
|
}
|
20
test/array/kth-smallest-element-in-a-sorted-matrix.test.js
Normal file
20
test/array/kth-smallest-element-in-a-sorted-matrix.test.js
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import { kthSmallest } from '../../src/array/kth-smallest-element-in-a-sorted-matrix.js'
|
||||||
|
|
||||||
|
test('有序矩阵中第K小的元素', () => {
|
||||||
|
expect(kthSmallest([
|
||||||
|
[1, 5, 9],
|
||||||
|
[10, 11, 13],
|
||||||
|
[12, 13, 15]
|
||||||
|
], 8)).toBe(13)
|
||||||
|
|
||||||
|
expect(kthSmallest([
|
||||||
|
[1, 5, 7],
|
||||||
|
[3, 7, 8],
|
||||||
|
[4, 8, 9]
|
||||||
|
], 4)).toBe(5)
|
||||||
|
|
||||||
|
expect(kthSmallest([
|
||||||
|
[1, 2],
|
||||||
|
[3, 4]
|
||||||
|
], 3)).toBe(3)
|
||||||
|
})
|
5
test/array/maximum-length-of-repeated-subarray.test.js
Normal file
5
test/array/maximum-length-of-repeated-subarray.test.js
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
import { findLength } from '../../src/array/maximum-length-of-repeated-subarray.js'
|
||||||
|
|
||||||
|
test('最长重复子数组', () => {
|
||||||
|
expect(findLength([1, 2, 3, 2, 1], [3, 2, 1, 4, 7])).toBe(3)
|
||||||
|
})
|
67
test/stack/yong-liang-ge-zhan-shi-xian-dui-lie-lcof.test.js
Normal file
67
test/stack/yong-liang-ge-zhan-shi-xian-dui-lie-lcof.test.js
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
import { CQueue } from '../../src/stack/yong-liang-ge-zhan-shi-xian-dui-lie-lcof.js'
|
||||||
|
|
||||||
|
test('用两个栈实现队列 - 1', () => {
|
||||||
|
let obj = null
|
||||||
|
const action = ['CQueue', 'appendTail', 'deleteHead', 'deleteHead']
|
||||||
|
const queue = [[], [3], [], []]
|
||||||
|
const res = []
|
||||||
|
while (queue.length) {
|
||||||
|
const tmp = action.shift()
|
||||||
|
const val = queue.shift()
|
||||||
|
if (tmp === 'CQueue') {
|
||||||
|
obj = new CQueue()
|
||||||
|
res.push(null)
|
||||||
|
} else if (tmp === 'appendTail') {
|
||||||
|
obj.appendTail(val[0])
|
||||||
|
res.push(null)
|
||||||
|
} else if (tmp === 'deleteHead') {
|
||||||
|
res.push(obj.deleteHead())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(res).toEqual([null, null, 3, -1])
|
||||||
|
})
|
||||||
|
|
||||||
|
test('用两个栈实现队列 - 2', () => {
|
||||||
|
let obj = null
|
||||||
|
const action = ['CQueue', 'deleteHead', 'appendTail', 'appendTail', 'deleteHead', 'deleteHead']
|
||||||
|
const queue = [[], [], [5], [2], [], []]
|
||||||
|
const res = []
|
||||||
|
while (queue.length) {
|
||||||
|
const tmp = action.shift()
|
||||||
|
const val = queue.shift()
|
||||||
|
if (tmp === 'CQueue') {
|
||||||
|
obj = new CQueue()
|
||||||
|
res.push(null)
|
||||||
|
} else if (tmp === 'appendTail') {
|
||||||
|
obj.appendTail(val[0])
|
||||||
|
res.push(null)
|
||||||
|
} else if (tmp === 'deleteHead') {
|
||||||
|
res.push(obj.deleteHead())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(res).toEqual([null, -1, null, null, 5, 2])
|
||||||
|
})
|
||||||
|
|
||||||
|
test('用两个栈实现队列 - 3', () => {
|
||||||
|
let obj = null
|
||||||
|
const action = ['CQueue', 'deleteHead', 'appendTail', 'deleteHead', 'deleteHead', 'deleteHead', 'deleteHead', 'appendTail', 'deleteHead', 'appendTail', 'appendTail', 'deleteHead', 'deleteHead', 'deleteHead', 'appendTail', 'deleteHead', 'deleteHead', 'deleteHead', 'deleteHead', 'appendTail', 'appendTail', 'appendTail', 'appendTail', 'deleteHead', 'deleteHead', 'appendTail', 'appendTail', 'deleteHead', 'deleteHead', 'deleteHead', 'appendTail', 'appendTail', 'deleteHead', 'appendTail', 'deleteHead', 'appendTail', 'appendTail', 'appendTail', 'deleteHead', 'deleteHead', 'appendTail', 'appendTail', 'deleteHead', 'deleteHead', 'deleteHead', 'deleteHead', 'appendTail', 'appendTail', 'deleteHead', 'deleteHead', 'appendTail', 'deleteHead', 'appendTail', 'appendTail', 'appendTail', 'appendTail', 'deleteHead', 'appendTail', 'deleteHead', 'deleteHead', 'appendTail', 'appendTail', 'appendTail', 'deleteHead', 'deleteHead', 'appendTail', 'appendTail', 'appendTail', 'deleteHead', 'deleteHead', 'deleteHead', 'deleteHead', 'appendTail', 'appendTail', 'deleteHead', 'deleteHead', 'appendTail', 'deleteHead', 'appendTail', 'appendTail', 'deleteHead', 'deleteHead', 'appendTail', 'deleteHead', 'appendTail', 'appendTail', 'appendTail', 'deleteHead', 'appendTail', 'appendTail', 'appendTail', 'appendTail', 'deleteHead', 'deleteHead', 'deleteHead', 'appendTail', 'deleteHead', 'appendTail', 'deleteHead', 'appendTail', 'appendTail']
|
||||||
|
const queue = [[], [], [97], [], [], [], [], [15], [], [1], [43], [], [], [], [18], [], [], [], [], [36], [69], [21], [91], [], [], [22], [40], [], [], [], [81], [65], [], [77], [], [63], [96], [5], [], [], [35], [90], [], [], [], [], [77], [83], [], [], [52], [], [2], [66], [87], [90], [], [2], [], [], [33], [16], [72], [], [], [14], [78], [8], [], [], [], [], [3], [83], [], [], [13], [], [79], [44], [], [], [33], [], [55], [76], [12], [], [91], [24], [49], [47], [], [], [], [85], [], [69], [], [94], [52]]
|
||||||
|
const res = []
|
||||||
|
while (queue.length) {
|
||||||
|
const tmp = action.shift()
|
||||||
|
const val = queue.shift()
|
||||||
|
if (tmp === 'CQueue') {
|
||||||
|
obj = new CQueue()
|
||||||
|
res.push(null)
|
||||||
|
} else if (tmp === 'appendTail') {
|
||||||
|
obj.appendTail(val[0])
|
||||||
|
res.push(null)
|
||||||
|
} else if (tmp === 'deleteHead') {
|
||||||
|
res.push(obj.deleteHead())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(res).toEqual([null, -1, null, 97, -1, -1, -1, null, 15, null, null, 1, 43, -1, null, 18, -1, -1, -1, null, null, null, null, 36, 69, null, null, 21, 91, 22, null, null, 40, null, 81, null, null, null, 65, 77, null, null, 63, 96, 5, 35, null, null, 90, 77, null, 83, null, null, null, null, 52, null, 2, 66, null, null, null, 87, 90, null, null, null, 2, 33, 16, 72, null, null, 14, 78, null, 8, null, null, 3, 83, null, 13, null, null, null, 79, null, null, null, null, 44, 33, 55, null, 76, null, 12, null, null])
|
||||||
|
})
|
@ -0,0 +1,5 @@
|
|||||||
|
import { sortedArrayToBST } from '../../src/tree/convert-sorted-array-to-binary-search-tree.js'
|
||||||
|
|
||||||
|
test('将有序数组转换为二叉搜索树', () => {
|
||||||
|
expect(sortedArrayToBST([-10, -3, 0, 5, 9])).toEqual({ left: { left: null, right: { left: null, right: null, val: -3 }, val: -10 }, right: { left: null, right: { left: null, right: null, val: 9 }, val: 5 }, val: 0 })
|
||||||
|
})
|
5
test/tree/unique-binary-search-trees.test.js
Normal file
5
test/tree/unique-binary-search-trees.test.js
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
import { numTrees } from '../../src/tree/unique-binary-search-trees'
|
||||||
|
|
||||||
|
test('不同的二叉搜索树', () => {
|
||||||
|
expect(numTrees(3)).toBe(5)
|
||||||
|
})
|
Reference in New Issue
Block a user