mirror of
https://gitee.com/coder-xiaomo/leetcode-problemset
synced 2025-10-19 03:56:46 +08:00
update
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
<p>一个音乐会总共有 <code>n</code> 排座位,编号从 <code>0</code> 到 <code>n - 1</code> ,每一排有 <code>m</code> 个座椅,编号为 <code>0</code> 到 <code>m - 1</code> 。你需要设计一个买票系统,针对以下情况进行座位安排:</p>
|
||||
|
||||
<ul>
|
||||
<li>同一组的 <code>k</code> 位观众坐在<strong> 同一排座位,且座位连续 </strong>。</li>
|
||||
<li><code>k</code> 位观众中 <strong>每一位</strong> 都有座位坐,但他们 <strong>不一定</strong> 坐在一起。</li>
|
||||
</ul>
|
||||
|
||||
<p>由于观众非常挑剔,所以:</p>
|
||||
|
||||
<ul>
|
||||
<li>只有当一个组里所有成员座位的排数都 <strong>小于等于</strong> <code>maxRow</code> ,这个组才能订座位。每一组的 <code>maxRow</code> 可能 <strong>不同</strong> 。</li>
|
||||
<li>如果有多排座位可以选择,优先选择 <strong>最小</strong> 的排数。如果同一排中有多个座位可以坐,优先选择号码 <strong>最小</strong> 的。</li>
|
||||
</ul>
|
||||
|
||||
<p>请你实现 <code>BookMyShow</code> 类:</p>
|
||||
|
||||
<ul>
|
||||
<li><code>BookMyShow(int n, int m)</code> ,初始化对象,<code>n</code> 是排数,<code>m</code> 是每一排的座位数。</li>
|
||||
<li><code>int[] gather(int k, int maxRow)</code> 返回长度为 <code>2</code> 的数组,表示 <code>k</code> 个成员中 <strong>第一个座位</strong> 的排数和座位编号,这 <code>k</code> 位成员必须坐在 <strong>同一排座位,且座位连续 </strong>。换言之,返回最小可能的 <code>r</code> 和 <code>c</code> 满足第 <code>r</code> 排中 <code>[c, c + k - 1]</code> 的座位都是空的,且 <code>r <= maxRow</code> 。如果 <strong>无法</strong> 安排座位,返回 <code>[]</code> 。</li>
|
||||
<li><code>boolean scatter(int k, int maxRow)</code> 如果组里所有 <code>k</code> 个成员 <strong>不一定</strong> 要坐在一起的前提下,都能在第 <code>0</code> 排到第 <code>maxRow</code> 排之间找到座位,那么请返回 <code>true</code> 。这种情况下,每个成员都优先找排数 <strong>最小</strong> ,然后是座位编号最小的座位。如果不能安排所有 <code>k</code> 个成员的座位,请返回 <code>false</code> 。</li>
|
||||
</ul>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>示例 1:</strong></p>
|
||||
|
||||
<pre>
|
||||
<strong>输入:</strong>
|
||||
["BookMyShow", "gather", "gather", "scatter", "scatter"]
|
||||
[[2, 5], [4, 0], [2, 0], [5, 1], [5, 1]]
|
||||
<strong>输出:</strong>
|
||||
[null, [0, 0], [], true, false]
|
||||
|
||||
<strong>解释:</strong>
|
||||
BookMyShow bms = new BookMyShow(2, 5); // 总共有 2 排,每排 5 个座位。
|
||||
bms.gather(4, 0); // 返回 [0, 0]
|
||||
// 这一组安排第 0 排 [0, 3] 的座位。
|
||||
bms.gather(2, 0); // 返回 []
|
||||
// 第 0 排只剩下 1 个座位。
|
||||
// 所以无法安排 2 个连续座位。
|
||||
bms.scatter(5, 1); // 返回 True
|
||||
// 这一组安排第 0 排第 4 个座位和第 1 排 [0, 3] 的座位。
|
||||
bms.scatter(5, 1); // 返回 False
|
||||
// 总共只剩下 2 个座位。
|
||||
</pre>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>提示:</strong></p>
|
||||
|
||||
<ul>
|
||||
<li><code>1 <= n <= 5 * 10<sup>4</sup></code></li>
|
||||
<li><code>1 <= m, k <= 10<sup>9</sup></code></li>
|
||||
<li><code>0 <= maxRow <= n - 1</code></li>
|
||||
<li><code>gather</code> 和 <code>scatter</code> <strong>总</strong> 调用次数不超过 <code>5 * 10<sup>4</sup></code> 次。</li>
|
||||
</ul>
|
@@ -0,0 +1,48 @@
|
||||
<p><strong>句子</strong> 是由若干个单词组成的字符串,单词之间用单个空格分隔,其中每个单词可以包含数字、小写字母、和美元符号 <code>'$'</code> 。如果单词的形式为美元符号后跟着一个非负实数,那么这个单词就表示一个价格。</p>
|
||||
|
||||
<ul>
|
||||
<li>例如 <code>"$100"</code>、<code>"$23"</code> 和 <code>"$6.75"</code> 表示价格,而 <code>"100"</code>、<code>"$"</code> 和 <code>"2$3"</code> 不是。</li>
|
||||
</ul>
|
||||
|
||||
<p><strong>注意:</strong>本题输入中的价格均为整数。</p>
|
||||
|
||||
<p>给你一个字符串 <code>sentence</code> 和一个整数 <code>discount</code> 。对于每个表示价格的单词,都在价格的基础上减免 <code>discount%</code> ,并 <strong>更新</strong> 该单词到句子中。所有更新后的价格应该表示为一个 <strong>恰好保留小数点后两位</strong> 的数字。</p>
|
||||
|
||||
<p>返回表示修改后句子的字符串。</p>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>示例 1:</strong></p>
|
||||
|
||||
<pre>
|
||||
<strong>输入:</strong>sentence = "there are $1 $2 and 5$ candies in the shop", discount = 50
|
||||
<strong>输出:</strong>"there are $0.50 $1.00 and 5$ candies in the shop"
|
||||
<strong>解释:</strong>
|
||||
表示价格的单词是 "$1" 和 "$2" 。
|
||||
- "$1" 减免 50% 为 "$0.50" ,所以 "$1" 替换为 "$0.50" 。
|
||||
- "$2" 减免 50% 为 "$1" ,所以 "$1" 替换为 "$1.00" 。</pre>
|
||||
|
||||
<p><strong>示例 2:</strong></p>
|
||||
|
||||
<pre>
|
||||
<strong>输入:</strong>sentence = "1 2 $3 4 $5 $6 7 8$ $9 $10$", discount = 100
|
||||
<strong>输出:</strong>"1 2 $0.00 4 $0.00 $0.00 7 8$ $0.00 $10$"
|
||||
<strong>解释:</strong>
|
||||
任何价格减免 100% 都会得到 0 。
|
||||
表示价格的单词分别是 "$3"、"$5"、"$6" 和 "$9"。
|
||||
每个单词都替换为 "$0.00"。
|
||||
</pre>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>提示:</strong></p>
|
||||
|
||||
<ul>
|
||||
<li><code>1 <= sentence.length <= 10<sup>5</sup></code></li>
|
||||
<li><code>sentence</code> 由小写英文字母、数字、<code>' '</code> 和 <code>'$'</code> 组成</li>
|
||||
<li><code>sentence</code> 不含前导和尾随空格</li>
|
||||
<li><code>sentence</code> 的所有单词都用单个空格分隔</li>
|
||||
<li>所有价格都是 <strong>正</strong> 整数且不含前导零</li>
|
||||
<li>所有价格 <strong>最多</strong> 为 <code>10</code> 位数字</li>
|
||||
<li><code>0 <= discount <= 100</code></li>
|
||||
</ul>
|
@@ -0,0 +1,34 @@
|
||||
<p>给你一个下标从 <strong>0</strong> 开始的整数数组 <code>nums</code> 。在一步操作中,移除所有满足 <code>nums[i - 1] > nums[i]</code> 的 <code>nums[i]</code> ,其中 <code>0 < i < nums.length</code> 。</p>
|
||||
|
||||
<p>重复执行步骤,直到 <code>nums</code> 变为 <strong>非递减</strong> 数组,返回所需执行的操作数。</p>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>示例 1:</strong></p>
|
||||
|
||||
<pre>
|
||||
<strong>输入:</strong>nums = [5,3,4,4,7,3,6,11,8,5,11]
|
||||
<strong>输出:</strong>3
|
||||
<strong>解释:</strong>执行下述几个步骤:
|
||||
- 步骤 1 :[5,<em><strong>3</strong></em>,4,4,7,<em><strong>3</strong></em>,6,11,<em><strong>8</strong></em>,<em><strong>5</strong></em>,11] 变为 [5,4,4,7,6,11,11]
|
||||
- 步骤 2 :[5,<em><strong>4</strong></em>,4,7,<em><strong>6</strong></em>,11,11] 变为 [5,4,7,11,11]
|
||||
- 步骤 3 :[5,<em><strong>4</strong></em>,7,11,11] 变为 [5,7,11,11]
|
||||
[5,7,11,11] 是一个非递减数组,因此,返回 3 。
|
||||
</pre>
|
||||
|
||||
<p><strong>示例 2:</strong></p>
|
||||
|
||||
<pre>
|
||||
<strong>输入:</strong>nums = [4,5,7,7,13]
|
||||
<strong>输出:</strong>0
|
||||
<strong>解释:</strong>nums 已经是一个非递减数组,因此,返回 0 。
|
||||
</pre>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>提示:</strong></p>
|
||||
|
||||
<ul>
|
||||
<li><code>1 <= nums.length <= 10<sup>5</sup></code></li>
|
||||
<li><code>1 <= nums[i] <= 10<sup>9</sup></code></li>
|
||||
</ul>
|
@@ -0,0 +1,54 @@
|
||||
<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>
|
@@ -0,0 +1,38 @@
|
||||
<p>给你一个下标从 <strong>0</strong> 开始长度为 <code>n</code> 的字符串 <code>num</code> ,它只包含数字。</p>
|
||||
|
||||
<p>如果对于 <strong>每个</strong><em> </em><code>0 <= i < n</code> 的下标 <code>i</code> ,都满足数位<em> </em><code>i</code> 在 <code>num</code> 中出现了 <code>num[i]</code>次,那么请你返回 <code>true</code> ,否则返回 <code>false</code> 。</p>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>示例 1:</strong></p>
|
||||
|
||||
<pre><b>输入:</b>num = "1210"
|
||||
<b>输出:</b>true
|
||||
<strong>解释:</strong>
|
||||
num[0] = '1' 。数字 0 在 num 中出现了一次。
|
||||
num[1] = '2' 。数字 1 在 num 中出现了两次。
|
||||
num[2] = '1' 。数字 2 在 num 中出现了一次。
|
||||
num[3] = '0' 。数字 3 在 num 中出现了零次。
|
||||
"1210" 满足题目要求条件,所以返回 true 。
|
||||
</pre>
|
||||
|
||||
<p><strong>示例 2:</strong></p>
|
||||
|
||||
<pre><b>输入:</b>num = "030"
|
||||
<b>输出:</b>false
|
||||
<strong>解释:</strong>
|
||||
num[0] = '0' 。数字 0 应该出现 0 次,但是在 num 中出现了一次。
|
||||
num[1] = '3' 。数字 1 应该出现 3 次,但是在 num 中出现了零次。
|
||||
num[2] = '0' 。数字 2 在 num 中出现了 0 次。
|
||||
下标 0 和 1 都违反了题目要求,所以返回 false 。
|
||||
</pre>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>提示:</strong></p>
|
||||
|
||||
<ul>
|
||||
<li><code>n == num.length</code></li>
|
||||
<li><code>1 <= n <= 10</code></li>
|
||||
<li><code>num</code> 只包含数字。</li>
|
||||
</ul>
|
@@ -0,0 +1,47 @@
|
||||
<p>给你一个下标从 <strong>0</strong> 开始的二维整数数组 <code>grid</code> ,数组大小为 <code>m x n</code> 。每个单元格都是两个值之一:</p>
|
||||
|
||||
<ul>
|
||||
<li><code>0</code> 表示一个 <strong>空</strong> 单元格,</li>
|
||||
<li><code>1</code> 表示一个可以移除的 <strong>障碍物</strong> 。</li>
|
||||
</ul>
|
||||
|
||||
<p>你可以向上、下、左、右移动,从一个空单元格移动到另一个空单元格。</p>
|
||||
|
||||
<p>现在你需要从左上角 <code>(0, 0)</code> 移动到右下角 <code>(m - 1, n - 1)</code> ,返回需要移除的障碍物的 <strong>最小</strong> 数目。</p>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>示例 1:</strong></p>
|
||||
|
||||
<p><img alt="" src="https://assets.leetcode.com/uploads/2022/04/06/example1drawio-1.png" style="width: 605px; height: 246px;" /></p>
|
||||
|
||||
<pre>
|
||||
<strong>输入:</strong>grid = [[0,1,1],[1,1,0],[1,1,0]]
|
||||
<strong>输出:</strong>2
|
||||
<strong>解释:</strong>可以移除位于 (0, 1) 和 (0, 2) 的障碍物来创建从 (0, 0) 到 (2, 2) 的路径。
|
||||
可以证明我们至少需要移除两个障碍物,所以返回 2 。
|
||||
注意,可能存在其他方式来移除 2 个障碍物,创建出可行的路径。
|
||||
</pre>
|
||||
|
||||
<p><strong>示例 2:</strong></p>
|
||||
|
||||
<p><img alt="" src="https://assets.leetcode.com/uploads/2022/04/06/example1drawio.png" style="width: 405px; height: 246px;" /></p>
|
||||
|
||||
<pre>
|
||||
<strong>输入:</strong>grid = [[0,1,0,0,0],[0,1,0,1,0],[0,0,0,1,0]]
|
||||
<strong>输出:</strong>0
|
||||
<strong>解释:</strong>不移除任何障碍物就能从 (0, 0) 到 (2, 4) ,所以返回 0 。
|
||||
</pre>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>提示:</strong></p>
|
||||
|
||||
<ul>
|
||||
<li><code>m == grid.length</code></li>
|
||||
<li><code>n == grid[i].length</code></li>
|
||||
<li><code>1 <= m, n <= 10<sup>5</sup></code></li>
|
||||
<li><code>2 <= m * n <= 10<sup>5</sup></code></li>
|
||||
<li><code>grid[i][j]</code> 为 <code>0</code> <strong>或</strong> <code>1</code></li>
|
||||
<li><code>grid[0][0] == grid[m - 1][n - 1] == 0</code></li>
|
||||
</ul>
|
@@ -0,0 +1,49 @@
|
||||
<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>
|
@@ -0,0 +1,47 @@
|
||||
<p>给你一个聊天记录,共包含 <code>n</code> 条信息。给你两个字符串数组 <code>messages</code> 和 <code>senders</code> ,其中 <code>messages[i]</code> 是 <code>senders[i]</code> 发出的一条 <strong>信息</strong> 。</p>
|
||||
|
||||
<p>一条 <strong>信息</strong> 是若干用单个空格连接的 <strong>单词</strong> ,信息开头和结尾不会有多余空格。发件人的 <strong>单词计数</strong> 是这个发件人总共发出的 <strong>单词数</strong> 。注意,一个发件人可能会发出多于一条信息。</p>
|
||||
|
||||
<p>请你返回发出单词数 <strong>最多</strong> 的发件人名字。如果有多个发件人发出最多单词数,请你返回 <strong>字典序</strong> 最大的名字。</p>
|
||||
|
||||
<p><strong>注意:</strong></p>
|
||||
|
||||
<ul>
|
||||
<li>字典序里,大写字母小于小写字母。</li>
|
||||
<li><code>"Alice"</code> 和 <code>"alice"</code> 是不同的名字。</li>
|
||||
</ul>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>示例 1:</strong></p>
|
||||
|
||||
<pre><b>输入:</b>messages = ["Hello userTwooo","Hi userThree","Wonderful day Alice","Nice day userThree"], senders = ["Alice","userTwo","userThree","Alice"]
|
||||
<b>输出:</b>"Alice"
|
||||
<b>解释:</b>Alice 总共发出了 2 + 3 = 5 个单词。
|
||||
userTwo 发出了 2 个单词。
|
||||
userThree 发出了 3 个单词。
|
||||
由于 Alice 发出单词数最多,所以我们返回 "Alice" 。
|
||||
</pre>
|
||||
|
||||
<p><strong>示例 2:</strong></p>
|
||||
|
||||
<pre><b>输入:</b>messages = ["How is leetcode for everyone","Leetcode is useful for practice"], senders = ["Bob","Charlie"]
|
||||
<b>输出:</b>"Charlie"
|
||||
<b>解释:</b>Bob 总共发出了 5 个单词。
|
||||
Charlie 总共发出了 5 个单词。
|
||||
由于最多单词数打平,返回字典序最大的名字,也就是 Charlie 。</pre>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>提示:</strong></p>
|
||||
|
||||
<ul>
|
||||
<li><code>n == messages.length == senders.length</code></li>
|
||||
<li><code>1 <= n <= 10<sup>4</sup></code></li>
|
||||
<li><code>1 <= messages[i].length <= 100</code></li>
|
||||
<li><code>1 <= senders[i].length <= 10</code></li>
|
||||
<li><code>messages[i]</code> 包含大写字母、小写字母和 <code>' '</code> 。</li>
|
||||
<li><code>messages[i]</code> 中所有单词都由 <strong>单个空格</strong> 隔开。</li>
|
||||
<li><code>messages[i]</code> 不包含前导和后缀空格。</li>
|
||||
<li><code>senders[i]</code> 只包含大写英文字母和小写英文字母。</li>
|
||||
</ul>
|
47
leetcode-cn/problem (Chinese)/极大极小游戏 [min-max-game].html
Normal file
47
leetcode-cn/problem (Chinese)/极大极小游戏 [min-max-game].html
Normal file
@@ -0,0 +1,47 @@
|
||||
<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>
|
@@ -0,0 +1,70 @@
|
||||
<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>
|
@@ -0,0 +1,53 @@
|
||||
<p>给你一个整数 <code>n</code> ,表示一个国家里的城市数目。城市编号为 <code>0</code> 到 <code>n - 1</code> 。</p>
|
||||
|
||||
<p>给你一个二维整数数组 <code>roads</code> ,其中 <code>roads[i] = [a<sub>i</sub>, b<sub>i</sub>]</code> 表示城市 <code>a<sub>i</sub></code> 和 <code>b<sub>i</sub></code> 之间有一条 <strong>双向</strong> 道路。</p>
|
||||
|
||||
<p>你需要给每个城市安排一个从 <code>1</code> 到 <code>n</code> 之间的整数值,且每个值只能被使用 <strong>一次</strong> 。道路的 <strong>重要性</strong> 定义为这条道路连接的两座城市数值 <strong>之和</strong> 。</p>
|
||||
|
||||
<p>请你返回在最优安排下,<strong>所有道路重要性</strong> 之和 <strong>最大</strong> 为多少。</p>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>示例 1:</strong></p>
|
||||
|
||||
<p><img alt="" src="https://assets.leetcode.com/uploads/2022/04/07/ex1drawio.png" style="width: 290px; height: 215px;"></p>
|
||||
|
||||
<pre><b>输入:</b>n = 5, roads = [[0,1],[1,2],[2,3],[0,2],[1,3],[2,4]]
|
||||
<b>输出:</b>43
|
||||
<b>解释:</b>上图展示了国家图和每个城市被安排的值 [2,4,5,3,1] 。
|
||||
- 道路 (0,1) 重要性为 2 + 4 = 6 。
|
||||
- 道路 (1,2) 重要性为 4 + 5 = 9 。
|
||||
- 道路 (2,3) 重要性为 5 + 3 = 8 。
|
||||
- 道路 (0,2) 重要性为 2 + 5 = 7 。
|
||||
- 道路 (1,3) 重要性为 4 + 3 = 7 。
|
||||
- 道路 (2,4) 重要性为 5 + 1 = 6 。
|
||||
所有道路重要性之和为 6 + 9 + 8 + 7 + 7 + 6 = 43 。
|
||||
可以证明,重要性之和不可能超过 43 。
|
||||
</pre>
|
||||
|
||||
<p><strong>示例 2:</strong></p>
|
||||
|
||||
<p><img alt="" src="https://assets.leetcode.com/uploads/2022/04/07/ex2drawio.png" style="width: 281px; height: 151px;"></p>
|
||||
|
||||
<pre><b>输入:</b>n = 5, roads = [[0,3],[2,4],[1,3]]
|
||||
<b>输出:</b>20
|
||||
<b>解释:</b>上图展示了国家图和每个城市被安排的值 [4,3,2,5,1] 。
|
||||
- 道路 (0,3) 重要性为 4 + 5 = 9 。
|
||||
- 道路 (2,4) 重要性为 2 + 1 = 3 。
|
||||
- 道路 (1,3) 重要性为 3 + 5 = 8 。
|
||||
所有道路重要性之和为 9 + 3 + 8 = 20 。
|
||||
可以证明,重要性之和不可能超过 20 。
|
||||
</pre>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>提示:</strong></p>
|
||||
|
||||
<ul>
|
||||
<li><code>2 <= n <= 5 * 10<sup>4</sup></code></li>
|
||||
<li><code>1 <= roads.length <= 5 * 10<sup>4</sup></code></li>
|
||||
<li><code>roads[i].length == 2</code></li>
|
||||
<li><code>0 <= a<sub>i</sub>, b<sub>i</sub> <= n - 1</code></li>
|
||||
<li><code>a<sub>i</sub> != b<sub>i</sub></code></li>
|
||||
<li>没有重复道路。</li>
|
||||
</ul>
|
@@ -0,0 +1,45 @@
|
||||
<p>给你两个下标从 <strong>0</strong> 开始的字符串 <code>s</code> 和 <code>target</code> 。你可以从 <code>s</code> 取出一些字符并将其重排,得到若干新的字符串。</p>
|
||||
|
||||
<p>从 <code>s</code> 中取出字符并重新排列,返回可以形成 <code>target</code> 的 <strong>最大</strong> 副本数。</p>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>示例 1:</strong></p>
|
||||
|
||||
<pre><strong>输入:</strong>s = "ilovecodingonleetcode", target = "code"
|
||||
<strong>输出:</strong>2
|
||||
<strong>解释:</strong>
|
||||
对于 "code" 的第 1 个副本,选取下标为 4 、5 、6 和 7 的字符。
|
||||
对于 "code" 的第 2 个副本,选取下标为 17 、18 、19 和 20 的字符。
|
||||
形成的字符串分别是 "ecod" 和 "code" ,都可以重排为 "code" 。
|
||||
可以形成最多 2 个 "code" 的副本,所以返回 2 。
|
||||
</pre>
|
||||
|
||||
<p><strong>示例 2:</strong></p>
|
||||
|
||||
<pre><strong>输入:</strong>s = "abcba", target = "abc"
|
||||
<strong>输出:</strong>1
|
||||
<strong>解释:</strong>
|
||||
选取下标为 0 、1 和 2 的字符,可以形成 "abc" 的 1 个副本。
|
||||
可以形成最多 1 个 "abc" 的副本,所以返回 1 。
|
||||
注意,尽管下标 3 和 4 分别有额外的 'a' 和 'b' ,但不能重用下标 2 处的 'c' ,所以无法形成 "abc" 的第 2 个副本。
|
||||
</pre>
|
||||
|
||||
<p><strong>示例 3:</strong></p>
|
||||
|
||||
<pre><strong>输入:</strong>s = "abbaccaddaeea", target = "aaaaa"
|
||||
<strong>输出:</strong>1
|
||||
<strong>解释:</strong>
|
||||
选取下标为 0 、3 、6 、9 和 12 的字符,可以形成 "aaaaa" 的 1 个副本。
|
||||
可以形成最多 1 个 "aaaaa" 的副本,所以返回 1 。
|
||||
</pre>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>提示:</strong></p>
|
||||
|
||||
<ul>
|
||||
<li><code>1 <= s.length <= 100</code></li>
|
||||
<li><code>1 <= target.length <= 10</code></li>
|
||||
<li><code>s</code> 和 <code>target</code> 由小写英文字母组成</li>
|
||||
</ul>
|
Reference in New Issue
Block a user