Skip to content

Commit efb5ed9

Browse files
author
robot
committed
2024-12
1 parent 83b4fe4 commit efb5ed9

File tree

4 files changed

+98
-74
lines changed

4 files changed

+98
-74
lines changed

src/codeTemplates/heap.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,56 @@ module.exports = () => ({
279279
},
280280
],
281281
},
282+
{
283+
text: t("Locale.codeTemplate.heap.item2"),
284+
problems: [
285+
{
286+
title: '295. 数据流的中位数',
287+
id: 'find-median-from-data-stream',
288+
},
289+
{
290+
title: '3321. 计算子数组的 x-sum II',
291+
id: 'find-x-sum-of-all-k-long-subarrays-ii',
292+
}
293+
],
294+
codes: [
295+
{
296+
language: 'py',
297+
text: `
298+
from collections import defaultdict
299+
from sortedcontainers import SortedList
300+
301+
class TwoHeap:
302+
def __init__(self, K):
303+
self.K = K
304+
self.st1 = SortedList() # 大顶堆存较小的 k 个。或干脆用 SortedList,这里我们用 SortedList
305+
self.st2 = SortedList() # 小顶堆存较大的 n - k 个。或干脆用 SortedList,这里我们用 SortedList
306+
307+
def adjust(self):
308+
while len(self.st2) > 0 and len(self.st1) < self.K:
309+
p = self.st2.pop(0)
310+
self.st1.add(p)
311+
while len(self.st1) > self.K:
312+
p = self.st1.pop(-1)
313+
self.st2.add(p)
314+
315+
def add(self, p):
316+
if len(self.st2) > 0 and p >= self.st2[0]:
317+
self.st2.add(p)
318+
else:
319+
self.st1.add(p)
320+
self.adjust()
321+
322+
def del_(self, p):
323+
if p in self.st1:
324+
self.st1.remove(p)
325+
else:
326+
self.st2.remove(p)
327+
self.adjust()
328+
`
329+
}
330+
]
331+
}
282332
],
283333
link: "https://leetcode-solution.cn/solutionDetail?url=https%3A%2F%2Fapi.github.com%2Frepos%2Fazl397985856%2Fleetcode%2Fcontents%2Fthinkings%2Fheap.md&type=1",
284334
});

src/db/root.db.js

Lines changed: 46 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -2565,60 +2565,12 @@
25652565
"sort-colors":{
25662566
"id": "75",
25672567
"name": "sort-colors",
2568-
"pre": [
2569-
{
2570-
"text": "荷兰国旗问题",
2571-
"link": "https://en.wikipedia.org/wiki/Dutch_national_flag_problem",
2572-
"color": "purple"
2573-
},
2574-
{
2575-
"text": "排序",
2576-
"link": null,
2577-
"color": "purple"
2578-
}
2579-
],
2580-
"keyPoints": [
2581-
{
2582-
"text": "荷兰国旗问题",
2583-
"link": null,
2584-
"color": "blue"
2585-
},
2586-
{
2587-
"text": "countingsort",
2588-
"link": null,
2589-
"color": "blue"
2590-
}
2591-
],
2592-
"companies": [
2593-
{
2594-
"name": "阿里巴巴"
2595-
},
2596-
{
2597-
"name": "腾讯"
2598-
},
2599-
{
2600-
"name": "百度"
2601-
},
2602-
{
2603-
"name": "字节跳动"
2604-
}
2605-
],
2568+
"pre": [],
2569+
"keyPoints": [],
2570+
"companies": [],
26062571
"giteeSolution": "https://gitee.com/golong/leetcode/blob/master/problems/75.sort-colors.md",
26072572
"solution": "https://github.com/azl397985856/leetcode/blob/master/problems/75.sort-colors.md",
2608-
"code": [
2609-
{
2610-
"language": "cpp",
2611-
"text": "\nclass Solution {\npublic:\n void sortColors(vector<int>& nums) {\n int r = 0, g = 0, b = 0;\n for (int n : nums) {\n if (n == 0) {\n nums[b++] = 2;\n nums[g++] = 1;\n nums[r++] = 0;\n } else if (n == 1) {\n nums[b++] = 2;\n nums[g++] = 1;\n } else nums[b++] = 2;\n }\n }\n};\n"
2612-
},
2613-
{
2614-
"language": "py",
2615-
"text": "\nclass Solution:\n def sortColors(self, strs):\n # p0 是右边界\n # p1 是右边界\n # p2 是左边界\n # p1 超过 p2 结束\n p0, p1, p2 = 0, 0, len(strs) - 1\n\n while p1 <= p2:\n if strs[p1] == 'blue':\n strs[p2], strs[p1] = strs[p1], strs[p2]\n p2 -= 1\n elif strs[p1] == 'red':\n strs[p0], strs[p1] = strs[p1], strs[p0]\n p0 += 1\n p1 += 1 # p0 一定不是 blue,因此 p1 += 1\n else: # p1 === 'green'\n p1 += 1\n return strs\n"
2616-
},
2617-
{
2618-
"language": "py",
2619-
"text": "\nclass Solution:\n def partition(self, head: ListNode, x: int) -> ListNode:\n l1 = cur = head\n while cur:\n if cur.val < x:\n cur.val, l1.val = l1.val, cur.val\n l1 = l1.next\n cur = cur.next\n return head\n"
2620-
}
2621-
]
2573+
"code": []
26222574
},
26232575
"subsets":{
26242576
"id": "78",
@@ -10593,9 +10545,17 @@
1059310545
"giteeSolution": "https://gitee.com/golong/leetcode/blob/master/problems/887.super-egg-drop.md",
1059410546
"solution": "https://github.com/azl397985856/leetcode/blob/master/problems/887.super-egg-drop.md",
1059510547
"code": [
10548+
{
10549+
"language": "java",
10550+
"text": "\nimport java.util.Arrays;\n\nclass Solution {\n public int superEggDrop(int K, int N) {\n int[][] dp = new int[K + 1][N + 1];\n \n for (int m = 1; m <= N; ++m) {\n for (int k = 1; k <= K; ++k) {\n dp[k][m] = dp[k - 1][m - 1] + 1 + dp[k][m - 1];\n if (dp[k][m] >= N) {\n return m;\n }\n }\n }\n \n return N; // Fallback, should not reach here\n }\n}\n\n"
10551+
},
1059610552
{
1059710553
"language": "js",
10598-
"text": "\nvar superEggDrop = function (K, N) {\n // 不选择dp[K][M]的原因是dp[M][K]可以简化操作\n const dp = Array(N + 1)\n .fill(0)\n .map((_) => Array(K + 1).fill(0));\n\n let m = 0;\n while (dp[m][K] < N) {\n m++;\n for (let k = 1; k <= K; ++k) dp[m][k] = dp[m - 1][k - 1] + 1 + dp[m - 1][k];\n }\n return m;\n};\n"
10554+
"text": "\n/**\n * @param {number} k\n * @param {number} n\n * @return {number}\n */\nvar superEggDrop = function superEggDrop(K, N) {\n const dp = Array.from({ length: K + 1 }, () => Array(N + 1).fill(0));\n \n for (let m = 1; m <= N; ++m) {\n for (let k = 1; k <= K; ++k) {\n dp[k][m] = dp[k - 1][m - 1] + 1 + dp[k][m - 1];\n if (dp[k][m] >= N) {\n return m;\n }\n }\n }\n \n return N; // Fallback, should not reach here\n}\n\n\n"
10555+
},
10556+
{
10557+
"language": "cpp",
10558+
"text": "\n#include <vector>\n#include <functional>\n\nclass Solution {\npublic:\n int superEggDrop(int K, int N) {\n std::vector<std::vector<int>> dp(K + 1, std::vector<int>(N + 1, 0));\n \n for (int m = 1; m <= N; ++m) {\n for (int k = 1; k <= K; ++k) {\n dp[k][m] = dp[k - 1][m - 1] + 1 + dp[k][m - 1];\n if (dp[k][m] >= N) {\n return m;\n }\n }\n }\n \n return N; // Fallback, should not reach here\n }\n};\n\n"
1059910559
},
1060010560
{
1060110561
"language": "py",
@@ -10611,23 +10571,19 @@
1061110571
},
1061210572
{
1061310573
"language": "py",
10614-
"text": "\nclass Solution:\n def superEggDrop(self, K: int, N: int) -> int:\n for i in range(K + 1):\n for j in range(N + 1):\n if i == 1:\n dp[i][j] = j\n if j == 1 or j == 0:\n dp[i][j] == j\n dp[i][j] = j\n for k in range(1, j + 1):\n dp[i][j] = min(dp[i][j], max(dp[i - 1][k - 1] + 1, dp[i][j - k] + 1))\n return dp[K][N]\n"
10574+
"text": "\nclass Solution:\n def superEggDrop(self, K: int, N: int) -> int:\n dp = [[i for _ in range(K+1)] for i in range(N + 1)]\n for i in range(N + 1):\n for j in range(1, K + 1):\n dp[i][j] = i\n if j == 1:\n continue\n if i == 1 or i == 0:\n break\n for k in range(1, i + 1):\n dp[i][j] = min(dp[i][j], max(dp[k - 1][j-1] + 1, dp[i-k][j] + 1))\n return dp[N][K]\n"
1061510575
},
1061610576
{
1061710577
"language": "py",
10618-
"text": "\nclass Solution:\n def superEggDrop(self, K: int, N: int) -> int:\n dp = [[0] * (K + 1) for _ in range(N + 1)]\n\n for i in range(N + 1):\n for j in range( K + 1):\n if j == 1:\n dp[i][j] = i\n if i == 1 or i == 0:\n dp[i][j] == i\n dp[i][j] = i\n for k in range(1, i + 1):\n dp[i][j] = min(dp[i][j], max(dp[k - 1][j - 1] + 1, dp[i - k][j] + 1))\n return dp[N][K]\n dp = [[0] * (N + 1) for _ in range(K + 1)]\n"
10578+
"text": "\nclass Solution:\n def superEggDrop(self, K: int, N: int) -> int:\n dp = [[i for i in range(N+1)] for _ in range(K + 1)]\n for i in range(1, K + 1):\n for j in range(N + 1):\n dp[i][j] = j\n if i == 1:\n break\n if j == 1 or j == 0:\n continue\n for k in range(1, j + 1):\n dp[i][j] = min(dp[i][j], max(dp[i - 1][k - 1] + 1, dp[i][j - k] + 1))\n return dp[K][N]\n"
1061910579
},
1062010580
{
1062110581
"language": "py",
10622-
"text": "\nclass Solution:\n def superEggDrop(self, K: int, N: int) -> int:\n def f(m, k):\n if k == 0 or m == 0: return 0\n return f(m - 1, k - 1) + 1 + f(m - 1, k)\n m = 0\n while f(m, K) < N:\n m += 1\n return m\n"
10582+
"text": "\nclass Solution:\n def superEggDrop(self, K: int, N: int) -> int:\n \n @cache\n def f(m, k):\n if k == 0 or m == 0: return 0\n return f(m - 1, k - 1) + 1 + f(m - 1, k)\n l, r = 1, N\n while l <= r:\n mid = (l + r) // 2\n if f(mid, K) >= N:\n r = mid - 1\n else:\n l = mid + 1\n \n return l\n"
1062310583
},
1062410584
{
1062510585
"language": "py",
10626-
"text": "\nclass Solution:\n def superEggDrop(self, K: int, N: int) -> int:\n dp = [[0] * (K + 1) for _ in range(N + 1)]\n m = 0\n while dp[m][K] < N:\n m += 1\n for i in range(1, K + 1):\n dp[m][i] = dp[m - 1][i - 1] + 1 + dp[m - 1][i]\n return m\n"
10627-
},
10628-
{
10629-
"language": "py",
10630-
"text": "\nclass Solution:\n def superEggDrop(self, K: int, N: int) -> int:\n dp = [[0] * (K + 1) for _ in range(N + 1)]\n m = 0\n while dp[m][K] < N:\n m += 1\n for i in range(1, K + 1):\n dp[m][i] = dp[m - 1][i - 1] + 1 + dp[m - 1][i]\n return m\n"
10586+
"text": "\nclass Solution:\n def superEggDrop(self, K: int, N: int) -> int:\n dp = [[0] * (N + 1) for _ in range(K + 1)]\n \n for m in range(1, N + 1):\n for k in range(1, K + 1):\n dp[k][m] = dp[k - 1][m - 1] + 1 + dp[k][m - 1]\n if dp[k][m] >= N:\n return m\n \n return N # Fallback, should not reach here\n"
1063110587
}
1063210588
]
1063310589
},
@@ -12789,21 +12745,15 @@
1278912745
"minimum-number-of-increments-on-subarrays-to-form-a-target-array":{
1279012746
"id": "1526",
1279112747
"name": "minimum-number-of-increments-on-subarrays-to-form-a-target-array",
12792-
"pre": [
12793-
{
12794-
"text": "差分与前缀和",
12795-
"link": null,
12796-
"color": "red"
12797-
}
12798-
],
12748+
"pre": [],
1279912749
"keyPoints": [
1280012750
{
1280112751
"text": "逆向思考",
1280212752
"link": null,
1280312753
"color": "blue"
1280412754
},
1280512755
{
12806-
"text": "使用差分减少时间复杂度",
12756+
"text": "考虑修改的左右端点",
1280712757
"link": null,
1280812758
"color": "blue"
1280912759
}
@@ -12814,11 +12764,7 @@
1281412764
"code": [
1281512765
{
1281612766
"language": "py",
12817-
"text": "\nclass Solution:\n def minNumberOperations(self, A: List[int]) -> int:\n d = [A[0]]\n ans = 0\n\n for i in range(1, len(A)):\n d.append(A[i] - A[i-1])\n for a in d:\n ans += max(0, a)\n return ans\n"
12818-
},
12819-
{
12820-
"language": "py",
12821-
"text": "\nclass Solution:\n def minNumberOperations(self, A: List[int]) -> int:\n ans = A[0]\n for i in range(1, len(A)):\n ans += max(0, A[i] - A[i-1])\n return ans\n"
12767+
"text": "\nclass Solution:\n def minNumberOperations(self, nums: List[int]) -> int:\n ans = abs(nums[0])\n for i in range(1, len(nums)):\n if abs(nums[i]) > abs(nums[i - 1]): # 这种情况,说明前面不能顺便把我改了,还需要我操作 k 次\n ans += abs(nums[i]) - abs(nums[i - 1])\n return ans\n"
1282212768
},
1282312769
{
1282412770
"language": "py",
@@ -14522,6 +14468,32 @@
1452214468
}
1452314469
]
1452414470
},
14471+
"minimum-operations-to-make-array-equal-to-target":{
14472+
"id": "3229",
14473+
"name": "minimum-operations-to-make-array-equal-to-target",
14474+
"pre": [],
14475+
"keyPoints": [
14476+
{
14477+
"text": "考虑修改的左右端点",
14478+
"link": null,
14479+
"color": "blue"
14480+
},
14481+
{
14482+
"text": "正负交替的情况,可以直接新开一段",
14483+
"link": null,
14484+
"color": "blue"
14485+
}
14486+
],
14487+
"companies": [],
14488+
"giteeSolution": "https://gitee.com/golong/leetcode/blob/master/problems/3229.minimum-operations-to-make-array-equal-to-target.md",
14489+
"solution": "https://github.com/azl397985856/leetcode/blob/master/problems/3229.minimum-operations-to-make-array-equal-to-target.md",
14490+
"code": [
14491+
{
14492+
"language": "py",
14493+
"text": "\n\nclass Solution:\n def minimumOperations(self, nums: List[int], target: List[int]) -> int:\n diff = []\n for i in range(len(nums)):\n diff.append(nums[i] - target[i])\n ans = abs(diff[0])\n for i in range(1, len(nums)):\n if diff[i] * diff[i - 1] >= 0: # 符号相同,可以贪心地复用\n if abs(diff[i]) > abs(diff[i - 1]): # 这种情况,说明前面不能顺便把我改了,还需要我操作一次\n ans += abs(diff[i]) - abs(diff[i - 1])\n else: # 符号不同,不可以复用,必须重新开启一段\n ans += abs(diff[i])\n return ans\n\n\n"
14494+
}
14495+
]
14496+
},
1452514497
"selling-pieces-of-wood":{
1452614498
"id": "5254",
1452714499
"name": "selling-pieces-of-wood",

src/locales/en.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,7 @@ const en = {
227227
heap: {
228228
title: "Heap",
229229
item1: "Min Heap",
230+
item2: "Two Heaps",
230231
},
231232

232233
slidingWindow: {

src/locales/zh.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ const zh = {
220220
heap: {
221221
title: "堆",
222222
item1: "小顶堆",
223+
item2: "对顶堆",
223224
},
224225

225226
slidingWindow: {

0 commit comments

Comments
 (0)