-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Big Update!!!更新了题库,包括200多道新增以及约十道的更新。
- Loading branch information
1 parent
eac545f
commit 3c322dd
Showing
209 changed files
with
11,376 additions
and
97 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
--- | ||
title: 2293.极大极小游戏 | ||
date: 2023-01-03 18-52-18 | ||
tags: [题解, LeetCode, 简单, 数组, 模拟] | ||
--- | ||
|
||
# 【LetMeFly】2293.极大极小游戏 | ||
|
||
力扣题目链接:[https://leetcode.cn/problems/min-max-game/](https://leetcode.cn/problems/min-max-game/) | ||
|
||
<p>给你一个下标从 <strong>0</strong> 开始的整数数组 <code>nums</code> ,其长度是 <code>2</code> 的幂。</p> | ||
|
||
<p>对 <code>nums</code> 执行下述算法:</p> | ||
|
||
<ol> | ||
<li>设 <code>n</code> 等于 <code>nums</code> 的长度,如果 <code>n == 1</code> ,<strong>终止</strong> 算法过程。否则,<strong>创建</strong> 一个新的整数数组 <code>newNums</code> ,新数组长度为 <code>n / 2</code> ,下标从 <strong>0</strong> 开始。</li> | ||
<li>对于满足 <code>0 <= i < n / 2</code> 的每个 <strong>偶数</strong> 下标 <code>i</code> ,将 <code>newNums[i]</code> <strong>赋值</strong> 为 <code>min(nums[2 * i], nums[2 * i + 1])</code> 。</li> | ||
<li>对于满足 <code>0 <= i < n / 2</code> 的每个 <strong>奇数</strong> 下标 <code>i</code> ,将 <code>newNums[i]</code> <strong>赋值</strong> 为 <code>max(nums[2 * i], nums[2 * i + 1])</code> 。</li> | ||
<li>用 <code>newNums</code> 替换 <code>nums</code> 。</li> | ||
<li>从步骤 1 开始 <strong>重复</strong> 整个过程。</li> | ||
</ol> | ||
|
||
<p>执行算法后,返回 <code>nums</code> 中剩下的那个数字。</p> | ||
|
||
<p> </p> | ||
|
||
<p><strong>示例 1:</strong></p> | ||
|
||
<p><img alt="" src="https://assets.leetcode.com/uploads/2022/04/13/example1drawio-1.png" style="width: 500px; height: 240px;" /></p> | ||
|
||
<pre> | ||
<strong>输入:</strong>nums = [1,3,5,2,4,8,2,2] | ||
<strong>输出:</strong>1 | ||
<strong>解释:</strong>重复执行算法会得到下述数组。 | ||
第一轮:nums = [1,5,4,2] | ||
第二轮:nums = [1,4] | ||
第三轮:nums = [1] | ||
1 是最后剩下的那个数字,返回 1 。 | ||
</pre> | ||
|
||
<p><strong>示例 2:</strong></p> | ||
|
||
<pre> | ||
<strong>输入:</strong>nums = [3] | ||
<strong>输出:</strong>3 | ||
<strong>解释:</strong>3 就是最后剩下的数字,返回 3 。 | ||
</pre> | ||
|
||
<p> </p> | ||
|
||
<p><strong>提示:</strong></p> | ||
|
||
<ul> | ||
<li><code>1 <= nums.length <= 1024</code></li> | ||
<li><code>1 <= nums[i] <= 10<sup>9</sup></code></li> | ||
<li><code>nums.length</code> 是 <code>2</code> 的幂</li> | ||
</ul> | ||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
--- | ||
title: 2294.划分数组使最大差为 K | ||
date: 2023-01-03 18-52-18 | ||
tags: [题解, LeetCode, 中等, 贪心, 数组, 排序] | ||
--- | ||
|
||
# 【LetMeFly】2294.划分数组使最大差为 K | ||
|
||
力扣题目链接:[https://leetcode.cn/problems/partition-array-such-that-maximum-difference-is-k/](https://leetcode.cn/problems/partition-array-such-that-maximum-difference-is-k/) | ||
|
||
<p>给你一个整数数组 <code>nums</code> 和一个整数 <code>k</code> 。你可以将 <code>nums</code> 划分成一个或多个 <strong>子序列</strong> ,使 <code>nums</code> 中的每个元素都 <strong>恰好</strong> 出现在一个子序列中。</p> | ||
|
||
<p>在满足每个子序列中最大值和最小值之间的差值最多为 <code>k</code> 的前提下,返回需要划分的 <strong>最少</strong> 子序列数目。</p> | ||
|
||
<p><strong>子序列</strong> 本质是一个序列,可以通过删除另一个序列中的某些元素(或者不删除)但不改变剩下元素的顺序得到。</p> | ||
|
||
<p> </p> | ||
|
||
<p><strong>示例 1:</strong></p> | ||
|
||
<pre> | ||
<strong>输入:</strong>nums = [3,6,1,2,5], k = 2 | ||
<strong>输出:</strong>2 | ||
<strong>解释:</strong> | ||
可以将 nums 划分为两个子序列 [3,1,2] 和 [6,5] 。 | ||
第一个子序列中最大值和最小值的差值是 3 - 1 = 2 。 | ||
第二个子序列中最大值和最小值的差值是 6 - 5 = 1 。 | ||
由于创建了两个子序列,返回 2 。可以证明需要划分的最少子序列数目就是 2 。 | ||
</pre> | ||
|
||
<p><strong>示例 2:</strong></p> | ||
|
||
<pre> | ||
<strong>输入:</strong>nums = [1,2,3], k = 1 | ||
<strong>输出:</strong>2 | ||
<strong>解释:</strong> | ||
可以将 nums 划分为两个子序列 [1,2] 和 [3] 。 | ||
第一个子序列中最大值和最小值的差值是 2 - 1 = 1 。 | ||
第二个子序列中最大值和最小值的差值是 3 - 3 = 0 。 | ||
由于创建了两个子序列,返回 2 。注意,另一种最优解法是将 nums 划分成子序列 [1] 和 [2,3] 。 | ||
</pre> | ||
|
||
<p><strong>示例 3:</strong></p> | ||
|
||
<pre> | ||
<strong>输入:</strong>nums = [2,2,4,5], k = 0 | ||
<strong>输出:</strong>3 | ||
<strong>解释:</strong> | ||
可以将 nums 划分为三个子序列 [2,2]、[4] 和 [5] 。 | ||
第一个子序列中最大值和最小值的差值是 2 - 2 = 0 。 | ||
第二个子序列中最大值和最小值的差值是 4 - 4 = 0 。 | ||
第三个子序列中最大值和最小值的差值是 5 - 5 = 0 。 | ||
由于创建了三个子序列,返回 3 。可以证明需要划分的最少子序列数目就是 3 。 | ||
</pre> | ||
|
||
<p> </p> | ||
|
||
<p><strong>提示:</strong></p> | ||
|
||
<ul> | ||
<li><code>1 <= nums.length <= 10<sup>5</sup></code></li> | ||
<li><code>0 <= nums[i] <= 10<sup>5</sup></code></li> | ||
<li><code>0 <= k <= 10<sup>5</sup></code></li> | ||
</ul> | ||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
--- | ||
title: 2295.替换数组中的元素 | ||
date: 2023-01-03 18-52-19 | ||
tags: [题解, LeetCode, 中等, 数组, 哈希表, 模拟] | ||
--- | ||
|
||
# 【LetMeFly】2295.替换数组中的元素 | ||
|
||
力扣题目链接:[https://leetcode.cn/problems/replace-elements-in-an-array/](https://leetcode.cn/problems/replace-elements-in-an-array/) | ||
|
||
<p>给你一个下标从 <strong>0</strong> 开始的数组 <code>nums</code> ,它包含 <code>n</code> 个 <strong>互不相同</strong> 的正整数。请你对这个数组执行 <code>m</code> 个操作,在第 <code>i</code> 个操作中,你需要将数字 <code>operations[i][0]</code> 替换成 <code>operations[i][1]</code> 。</p> | ||
|
||
<p>题目保证在第 <code>i</code> 个操作中:</p> | ||
|
||
<ul> | ||
<li><code>operations[i][0]</code> 在 <code>nums</code> 中存在。</li> | ||
<li><code>operations[i][1]</code> 在 <code>nums</code> 中不存在。</li> | ||
</ul> | ||
|
||
<p>请你返回执行完所有操作后的数组。</p> | ||
|
||
<p> </p> | ||
|
||
<p><strong>示例 1:</strong></p> | ||
|
||
<pre><b>输入:</b>nums = [1,2,4,6], operations = [[1,3],[4,7],[6,1]] | ||
<b>输出:</b>[3,2,7,1] | ||
<b>解释:</b>我们对 nums 执行以下操作: | ||
- 将数字 1 替换为 3 。nums 变为 [<em><strong>3</strong></em>,2,4,6] 。 | ||
- 将数字 4 替换为 7 。nums 变为 [3,2,<em><strong>7</strong></em>,6] 。 | ||
- 将数字 6 替换为 1 。nums 变为 [3,2,7,<em><strong>1</strong></em>] 。 | ||
返回最终数组 [3,2,7,1] 。 | ||
</pre> | ||
|
||
<p><strong>示例 2:</strong></p> | ||
|
||
<pre><b>输入:</b>nums = [1,2], operations = [[1,3],[2,1],[3,2]] | ||
<b>输出:</b>[2,1] | ||
<b>解释:</b>我们对 nums 执行以下操作: | ||
- 将数字 1 替换为 3 。nums 变为 [<em><strong>3</strong></em>,2] 。 | ||
- 将数字 2 替换为 1 。nums 变为 [3,<em><strong>1</strong></em>] 。 | ||
- 将数字 3 替换为 2 。nums 变为 [<em><strong>2</strong></em>,1] 。 | ||
返回最终数组 [2,1] 。 | ||
</pre> | ||
|
||
<p> </p> | ||
|
||
<p><strong>提示:</strong></p> | ||
|
||
<ul> | ||
<li><code>n == nums.length</code></li> | ||
<li><code>m == operations.length</code></li> | ||
<li><code>1 <= n, m <= 10<sup>5</sup></code></li> | ||
<li><code>nums</code> 中所有数字 <strong>互不相同</strong> 。</li> | ||
<li><code>operations[i].length == 2</code></li> | ||
<li><code>1 <= nums[i], operations[i][0], operations[i][1] <= 10<sup>6</sup></code></li> | ||
<li>在执行第 <code>i</code> 个操作时,<code>operations[i][0]</code> 在 <code>nums</code> 中存在。</li> | ||
<li>在执行第 <code>i</code> 个操作时,<code>operations[i][1]</code> 在 <code>nums</code> 中不存在。</li> | ||
</ul> | ||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
--- | ||
title: 2296.设计一个文本编辑器 | ||
date: 2023-01-03 18-52-19 | ||
tags: [题解, LeetCode, 困难, 栈, 设计, 链表, 字符串, 双向链表, 模拟] | ||
--- | ||
|
||
# 【LetMeFly】2296.设计一个文本编辑器 | ||
|
||
力扣题目链接:[https://leetcode.cn/problems/design-a-text-editor/](https://leetcode.cn/problems/design-a-text-editor/) | ||
|
||
<p>请你设计一个带光标的文本编辑器,它可以实现以下功能:</p> | ||
|
||
<ul> | ||
<li><strong>添加:</strong>在光标所在处添加文本。</li> | ||
<li><strong>删除:</strong>在光标所在处删除文本(模拟键盘的删除键)。</li> | ||
<li><strong>移动:</strong>将光标往左或者往右移动。</li> | ||
</ul> | ||
|
||
<p>当删除文本时,只有光标左边的字符会被删除。光标会留在文本内,也就是说任意时候 <code>0 <= cursor.position <= currentText.length</code> 都成立。</p> | ||
|
||
<p>请你实现 <code>TextEditor</code> 类:</p> | ||
|
||
<ul> | ||
<li><code>TextEditor()</code> 用空文本初始化对象。</li> | ||
<li><code>void addText(string text)</code> 将 <code>text</code> 添加到光标所在位置。添加完后光标在 <code>text</code> 的右边。</li> | ||
<li><code>int deleteText(int k)</code> 删除光标左边 <code>k</code> 个字符。返回实际删除的字符数目。</li> | ||
<li><code>string cursorLeft(int k)</code> 将光标向左移动 <code>k</code> 次。返回移动后光标左边 <code>min(10, len)</code> 个字符,其中 <code>len</code> 是光标左边的字符数目。</li> | ||
<li><code>string cursorRight(int k)</code> 将光标向右移动 <code>k</code> 次。返回移动后光标左边 <code>min(10, len)</code> 个字符,其中 <code>len</code> 是光标左边的字符数目。</li> | ||
</ul> | ||
|
||
<p> </p> | ||
|
||
<p><strong>示例 1:</strong></p> | ||
|
||
<pre> | ||
<strong>输入:</strong> | ||
["TextEditor", "addText", "deleteText", "addText", "cursorRight", "cursorLeft", "deleteText", "cursorLeft", "cursorRight"] | ||
[[], ["leetcode"], [4], ["practice"], [3], [8], [10], [2], [6]] | ||
<strong>输出:</strong> | ||
[null, null, 4, null, "etpractice", "leet", 4, "", "practi"] | ||
|
||
<strong>解释:</strong> | ||
TextEditor textEditor = new TextEditor(); // 当前 text 为 "|" 。('|' 字符表示光标) | ||
textEditor.addText("leetcode"); // 当前文本为 "leetcode|" 。 | ||
textEditor.deleteText(4); // 返回 4 | ||
// 当前文本为 "leet|" 。 | ||
// 删除了 4 个字符。 | ||
textEditor.addText("practice"); // 当前文本为 "leetpractice|" 。 | ||
textEditor.cursorRight(3); // 返回 "etpractice" | ||
// 当前文本为 "leetpractice|". | ||
// 光标无法移动到文本以外,所以无法移动。 | ||
// "etpractice" 是光标左边的 10 个字符。 | ||
textEditor.cursorLeft(8); // 返回 "leet" | ||
// 当前文本为 "leet|practice" 。 | ||
// "leet" 是光标左边的 min(10, 4) = 4 个字符。 | ||
textEditor.deleteText(10); // 返回 4 | ||
// 当前文本为 "|practice" 。 | ||
// 只有 4 个字符被删除了。 | ||
textEditor.cursorLeft(2); // 返回 "" | ||
// 当前文本为 "|practice" 。 | ||
// 光标无法移动到文本以外,所以无法移动。 | ||
// "" 是光标左边的 min(10, 0) = 0 个字符。 | ||
textEditor.cursorRight(6); // 返回 "practi" | ||
// 当前文本为 "practi|ce" 。 | ||
// "practi" 是光标左边的 min(10, 6) = 6 个字符。 | ||
</pre> | ||
|
||
<p> </p> | ||
|
||
<p><strong>提示:</strong></p> | ||
|
||
<ul> | ||
<li><code>1 <= text.length, k <= 40</code></li> | ||
<li><code>text</code> 只含有小写英文字母。</li> | ||
<li>调用 <code>addText</code> ,<code>deleteText</code> ,<code>cursorLeft</code> 和 <code>cursorRight</code> 的 <strong>总</strong> 次数不超过 <code>2 * 10<sup>4</sup></code> 次。</li> | ||
</ul> | ||
|
||
<p> </p> | ||
|
||
<p><strong>进阶:</strong>你能设计并实现一个每次调用时间复杂度为 <code>O(k)</code> 的解决方案吗?</p> | ||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
--- | ||
title: 2299.强密码检验器 II | ||
date: 2023-01-03 18-52-21 | ||
tags: [题解, LeetCode, 简单, 字符串] | ||
--- | ||
|
||
# 【LetMeFly】2299.强密码检验器 II | ||
|
||
力扣题目链接:[https://leetcode.cn/problems/strong-password-checker-ii/](https://leetcode.cn/problems/strong-password-checker-ii/) | ||
|
||
<p>如果一个密码满足以下所有条件,我们称它是一个 <strong>强</strong> 密码:</p> | ||
|
||
<ul> | ||
<li>它有至少 <code>8</code> 个字符。</li> | ||
<li>至少包含 <strong>一个小写英文</strong> 字母。</li> | ||
<li>至少包含 <strong>一个大写英文</strong> 字母。</li> | ||
<li>至少包含 <strong>一个数字</strong> 。</li> | ||
<li>至少包含 <strong>一个特殊字符</strong> 。特殊字符为:<code>"!@#$%^&*()-+"</code> 中的一个。</li> | ||
<li>它 <strong>不</strong> 包含 <code>2</code> 个连续相同的字符(比方说 <code>"aab"</code> 不符合该条件,但是 <code>"aba"</code> 符合该条件)。</li> | ||
</ul> | ||
|
||
<p>给你一个字符串 <code>password</code> ,如果它是一个 <strong>强</strong> 密码,返回 <code>true</code>,否则返回 <code>false</code> 。</p> | ||
|
||
<p> </p> | ||
|
||
<p><strong>示例 1:</strong></p> | ||
|
||
<pre><b>输入:</b>password = "IloveLe3tcode!" | ||
<b>输出:</b>true | ||
<b>解释:</b>密码满足所有的要求,所以我们返回 true 。 | ||
</pre> | ||
|
||
<p><strong>示例 2:</strong></p> | ||
|
||
<pre><b>输入:</b>password = "Me+You--IsMyDream" | ||
<b>输出:</b>false | ||
<b>解释:</b>密码不包含数字,且包含 2 个连续相同的字符。所以我们返回 false 。 | ||
</pre> | ||
|
||
<p><strong>示例 3:</strong></p> | ||
|
||
<pre><b>输入:</b>password = "1aB!" | ||
<b>输出:</b>false | ||
<b>解释:</b>密码不符合长度要求。所以我们返回 false 。</pre> | ||
|
||
<p> </p> | ||
|
||
<p><strong>提示:</strong></p> | ||
|
||
<ul> | ||
<li><code>1 <= password.length <= 100</code></li> | ||
<li><code>password</code> 包含字母,数字和 <code>"!@#$%^&*()-+"</code> 这些特殊字符。</li> | ||
</ul> | ||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
--- | ||
title: 2300.咒语和药水的成功对数 | ||
date: 2023-01-03 18-52-21 | ||
tags: [题解, LeetCode, 中等, 数组, 双指针, 二分查找, 排序] | ||
--- | ||
|
||
# 【LetMeFly】2300.咒语和药水的成功对数 | ||
|
||
力扣题目链接:[https://leetcode.cn/problems/successful-pairs-of-spells-and-potions/](https://leetcode.cn/problems/successful-pairs-of-spells-and-potions/) | ||
|
||
<p>给你两个正整数数组 <code>spells</code> 和 <code>potions</code> ,长度分别为 <code>n</code> 和 <code>m</code> ,其中 <code>spells[i]</code> 表示第 <code>i</code> 个咒语的能量强度,<code>potions[j]</code> 表示第 <code>j</code> 瓶药水的能量强度。</p> | ||
|
||
<p>同时给你一个整数 <code>success</code> 。一个咒语和药水的能量强度 <strong>相乘</strong> 如果 <strong>大于等于</strong> <code>success</code> ,那么它们视为一对 <strong>成功</strong> 的组合。</p> | ||
|
||
<p>请你返回一个长度为 <code>n</code> 的整数数组<em> </em><code>pairs</code>,其中<em> </em><code>pairs[i]</code> 是能跟第 <code>i</code> 个咒语成功组合的 <b>药水</b> 数目。</p> | ||
|
||
<p> </p> | ||
|
||
<p><strong>示例 1:</strong></p> | ||
|
||
<pre><b>输入:</b>spells = [5,1,3], potions = [1,2,3,4,5], success = 7 | ||
<b>输出:</b>[4,0,3] | ||
<strong>解释:</strong> | ||
- 第 0 个咒语:5 * [1,2,3,4,5] = [5,<em><strong>10</strong></em>,<em><strong>15</strong></em>,<em><strong>20</strong></em>,<em><strong>25</strong></em>] 。总共 4 个成功组合。 | ||
- 第 1 个咒语:1 * [1,2,3,4,5] = [1,2,3,4,5] 。总共 0 个成功组合。 | ||
- 第 2 个咒语:3 * [1,2,3,4,5] = [3,6,<em><strong>9</strong></em>,<em><strong>12</strong></em>,<em><strong>15</strong></em>] 。总共 3 个成功组合。 | ||
所以返回 [4,0,3] 。 | ||
</pre> | ||
|
||
<p><strong>示例 2:</strong></p> | ||
|
||
<pre><b>输入:</b>spells = [3,1,2], potions = [8,5,8], success = 16 | ||
<b>输出:</b>[2,0,2] | ||
<strong>解释:</strong> | ||
- 第 0 个咒语:3 * [8,5,8] = [<em><strong>24</strong></em>,15,<em><strong>24</strong></em>] 。总共 2 个成功组合。 | ||
- 第 1 个咒语:1 * [8,5,8] = [8,5,8] 。总共 0 个成功组合。 | ||
- 第 2 个咒语:2 * [8,5,8] = [<em><strong>16</strong></em>,10,<em><strong>16</strong></em>] 。总共 2 个成功组合。 | ||
所以返回 [2,0,2] 。 | ||
</pre> | ||
|
||
<p> </p> | ||
|
||
<p><strong>提示:</strong></p> | ||
|
||
<ul> | ||
<li><code>n == spells.length</code></li> | ||
<li><code>m == potions.length</code></li> | ||
<li><code>1 <= n, m <= 10<sup>5</sup></code></li> | ||
<li><code>1 <= spells[i], potions[i] <= 10<sup>5</sup></code></li> | ||
<li><code>1 <= success <= 10<sup>10</sup></code></li> | ||
</ul> | ||
|
||
|
||
|
Oops, something went wrong.