1
0
mirror of https://gitee.com/coder-xiaomo/leetcode-problemset synced 2025-09-04 23:11:41 +08:00
Code Issues Projects Releases Wiki Activity GitHub Gitee
This commit is contained in:
2023-01-14 00:20:24 +08:00
parent 147005c405
commit f8425bb3ee
45 changed files with 17183 additions and 12585 deletions

View File

@@ -0,0 +1,41 @@
<p>给你两个下标从 <strong>0</strong> 开始的字符串 <code>word1</code><code>word2</code></p>
<p>一次 <strong>移动</strong> 由以下两个步骤组成:</p>
<ul>
<li>选中两个下标&nbsp;<code>i</code><code>j</code> ,分别满足 <code>0 &lt;= i &lt; word1.length</code><code>0 &lt;= j &lt; word2.length</code> </li>
<li>交换 <code>word1[i]</code><code>word2[j]</code></li>
</ul>
<p>如果可以通过 <strong>恰好一次</strong> 移动,使 <code>word1</code><code>word2</code> 中不同字符的数目相等,则返回 <code>true</code> ;否则,返回 <code>false</code></p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><strong>输入:</strong>word1 = "ac", word2 = "b"
<strong>输出:</strong>false
<strong>解释:</strong>交换任何一组下标都会导致第一个字符串中有 2 个不同的字符,而在第二个字符串中只有 1 个不同字符。
</pre>
<p><strong>示例 2</strong></p>
<pre><strong>输入:</strong>word1 = "abcc", word2 = "aab"
<strong>输出:</strong>true
<strong>解释:</strong>交换第一个字符串的下标 2 和第二个字符串的下标 0 。之后得到 word1 = "abac" 和 word2 = "cab" ,各有 3 个不同字符。
</pre>
<p><strong>示例 3</strong></p>
<pre><strong>输入:</strong>word1 = "abcde", word2 = "fghij"
<strong>输出:</strong>true
<strong>解释:</strong>无论交换哪一组下标,两个字符串中都会有 5 个不同字符。</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= word1.length, word2.length &lt;= 10<sup>5</sup></code></li>
<li><code>word1</code><code>word2</code> 仅由小写英文字母组成。</li>
</ul>

View File

@@ -0,0 +1,44 @@
<p>给你一个下标从 <strong>0</strong> 开始的整数数组 <code>nums</code> 和一个整数 <code>k</code> 。你的 <strong>起始分数</strong><code>0</code></p>
<p>在一步 <strong>操作</strong> 中:</p>
<ol>
<li>选出一个满足 <code>0 &lt;= i &lt; nums.length</code> 的下标 <code>i</code> </li>
<li>将你的 <strong>分数</strong> 增加 <code>nums[i]</code> ,并且</li>
<li><code>nums[i]</code> 替换为 <code>ceil(nums[i] / 3)</code></li>
</ol>
<p>返回在 <strong>恰好</strong> 执行 <code>k</code> 次操作后,你可能获得的最大分数。</p>
<p>向上取整函数 <code>ceil(val)</code> 的结果是大于或等于 <code>val</code> 的最小整数。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>nums = [10,10,10,10,10], k = 5
<strong>输出:</strong>50
<strong>解释:</strong>对数组中每个元素执行一次操作。最后分数是 10 + 10 + 10 + 10 + 10 = 50 。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>nums = [1,10,3,3,3], k = 3
<strong>输出:</strong>17
<strong>解释:</strong>可以执行下述操作:
第 1 步操作:选中 i = 1 nums 变为 [1,<em><strong>4</strong></em>,3,3,3] 。分数增加 10 。
第 2 步操作:选中 i = 1 nums 变为 [1,<em><strong>2</strong></em>,3,3,3] 。分数增加 4 。
第 3 步操作:选中 i = 2 nums 变为 [1,1,<em><strong>1</strong></em>,3,3] 。分数增加 3 。
最后分数是 10 + 4 + 3 = 17 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= nums.length, k &lt;= 10<sup>5</sup></code></li>
<li><code>1 &lt;= nums[i] &lt;= 10<sup>9</sup></code></li>
</ul>

View File

@@ -0,0 +1,39 @@
<p>给你一个整数数据流,请你实现一个数据结构,检查数据流中最后&nbsp;<code>k</code>&nbsp;个整数是否 <strong>等于</strong> 给定值&nbsp;<code>value</code>&nbsp;</p>
<p>请你实现&nbsp;<strong>DataStream</strong>&nbsp;类:</p>
<ul>
<li><code>DataStream(int value, int k)</code>&nbsp;用两个整数 <code>value</code>&nbsp;<code>k</code>&nbsp;初始化一个空的整数数据流。</li>
<li><code>boolean consec(int num)</code>&nbsp;&nbsp;<code>num</code>&nbsp;添加到整数数据流。如果后 <code>k</code>&nbsp;个整数都等于&nbsp;<code>value</code>&nbsp;,返回&nbsp;<code>true</code>&nbsp;,否则返回&nbsp;<code>false</code>&nbsp;。如果少于&nbsp;<code>k</code>&nbsp;个整数,条件不满足,所以也返回&nbsp;<code>false</code>&nbsp;</li>
</ul>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>
["DataStream", "consec", "consec", "consec", "consec"]
[[4, 3], [4], [4], [4], [3]]
<strong>输出:</strong>
[null, false, false, true, false]
<strong>解释:</strong>
DataStream dataStream = new DataStream(4, 3); // value = 4, k = 3
dataStream.consec(4); // 数据流中只有 1 个整数,所以返回 False 。
dataStream.consec(4); // 数据流中只有 2 个整数
// 由于 2 小于 k ,返回 False 。
dataStream.consec(4); // 数据流最后 3 个整数都等于 value 所以返回 True 。
dataStream.consec(3); // 最后 k 个整数分别是 [4,4,3] 。
// 由于 3 不等于 value ,返回 False 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= value, num &lt;= 10<sup>9</sup></code></li>
<li><code>1 &lt;= k &lt;= 10<sup>5</sup></code></li>
<li>至多调用 <code>consec</code>&nbsp;次数为&nbsp;<code>10<sup>5</sup></code>&nbsp;次。</li>
</ul>

View File

@@ -0,0 +1,55 @@
<p>给你一个下标从 <strong>0</strong>&nbsp;开始长度为 <code>n</code>&nbsp;的整数数组&nbsp;<code>stations</code>&nbsp;,其中&nbsp;<code>stations[i]</code>&nbsp;表示第 <code>i</code>&nbsp;座城市的供电站数目。</p>
<p>每个供电站可以在一定 <strong>范围</strong>&nbsp;内给所有城市提供电力。换句话说,如果给定的范围是&nbsp;<code>r</code>&nbsp;,在城市&nbsp;<code>i</code>&nbsp;处的供电站可以给所有满足&nbsp;<code>|i - j| &lt;= r</code>&nbsp;<code>0 &lt;= i, j &lt;= n - 1</code>&nbsp;的城市&nbsp;<code>j</code>&nbsp;供电。</p>
<ul>
<li><code>|x|</code>&nbsp;表示 <code>x</code>&nbsp;<strong>绝对值</strong>&nbsp;。比方说,<code>|7 - 5| = 2</code>&nbsp;<code>|3 - 10| = 7</code>&nbsp;</li>
</ul>
<p>一座城市的 <strong>电量</strong>&nbsp;是所有能给它供电的供电站数目。</p>
<p>政府批准了可以额外建造 <code>k</code>&nbsp;座供电站,你需要决定这些供电站分别应该建在哪里,这些供电站与已经存在的供电站有相同的供电范围。</p>
<p>给你两个整数&nbsp;<code>r</code>&nbsp;<code>k</code>&nbsp;,如果以最优策略建造额外的发电站,返回所有城市中,最小供电站数目的最大值是多少。</p>
<p><code>k</code>&nbsp;座供电站可以建在多个城市。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<b>输入:</b>stations = [1,2,4,5,0], r = 1, k = 2
<b>输出:</b>5
<b>解释:</b>
最优方案之一是把 2 座供电站都建在城市 1 。
每座城市的供电站数目分别为 [1,4,4,5,0] 。
- 城市 0 的供电站数目为 1 + 4 = 5 。
- 城市 1 的供电站数目为 1 + 4 + 4 = 9 。
- 城市 2 的供电站数目为 4 + 4 + 5 = 13 。
- 城市 3 的供电站数目为 5 + 4 = 9 。
- 城市 4 的供电站数目为 5 + 0 = 5 。
供电站数目最少是 5 。
无法得到更优解,所以我们返回 5 。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<b>输入:</b>stations = [4,4,4,4], r = 0, k = 3
<b>输出:</b>4
<b>解释:</b>
无论如何安排,总有一座城市的供电站数目是 4 ,所以最优解是 4 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>n == stations.length</code></li>
<li><code>1 &lt;= n &lt;= 10<sup>5</sup></code></li>
<li><code>0 &lt;= stations[i] &lt;= 10<sup>5</sup></code></li>
<li><code>0 &lt;= r&nbsp;&lt;= n - 1</code></li>
<li><code>0 &lt;= k&nbsp;&lt;= 10<sup>9</sup></code></li>
</ul>

View File

@@ -0,0 +1,50 @@
<p>给你一个下标从 <strong>0</strong>&nbsp;开始的整数数组&nbsp;<code>nums</code>&nbsp;</p>
<p>三个下标&nbsp;<code>i</code>&nbsp;<code>j</code>&nbsp;&nbsp;<code>k</code>&nbsp;<strong>有效值</strong>&nbsp;定义为&nbsp;<code>((nums[i] | nums[j]) &amp; nums[k])</code>&nbsp;</p>
<p>一个数组的 <strong>xor 美丽值</strong>&nbsp;是数组中所有满足&nbsp;<code>0 &lt;= i, j, k &lt; n</code>&nbsp;&nbsp;<strong>的三元组</strong>&nbsp;<code>(i, j, k)</code>&nbsp;<strong>有效值</strong>&nbsp;的异或结果。</p>
<p>请你返回&nbsp;<code>nums</code>&nbsp;的 xor 美丽值。</p>
<p><b>注意:</b></p>
<ul>
<li><code>val1 | val2</code>&nbsp;&nbsp;<code>val1</code>&nbsp;<code>val2</code>&nbsp;的按位或。</li>
<li><code>val1 &amp; val2</code>&nbsp;&nbsp;<code>val1</code>&nbsp;<code>val2</code>&nbsp;的按位与。</li>
</ul>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<b>输入:</b>nums = [1,4]
<b>输出:</b>5
<b>解释:</b>
三元组和它们对应的有效值如下:
- (0,0,0) 有效值为 ((1 | 1) &amp; 1) = 1
- (0,0,1) 有效值为 ((1 | 1) &amp; 4) = 0
- (0,1,0) 有效值为 ((1 | 4) &amp; 1) = 1
- (0,1,1) 有效值为 ((1 | 4) &amp; 4) = 4
- (1,0,0) 有效值为 ((4 | 1) &amp; 1) = 1
- (1,0,1) 有效值为 ((4 | 1) &amp; 4) = 4
- (1,1,0) 有效值为 ((4 | 4) &amp; 1) = 0
- (1,1,1) 有效值为 ((4 | 4) &amp; 4) = 4
数组的 xor 美丽值为所有有效值的按位异或 1 ^ 0 ^ 1 ^ 4 ^ 1 ^ 4 ^ 0 ^ 4 = 5 。</pre>
<p><strong>示例 2</strong></p>
<pre>
<b>输入:</b>nums = [15,45,20,2,34,35,5,44,32,30]
<b>输出:</b>34
<code><span style=""><b>解释:</b>数组的 xor 美丽值为</span> 34 。</code>
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= nums.length&nbsp;&lt;= 10<sup>5</sup></code></li>
<li><code>1 &lt;= nums[i] &lt;= 10<sup>9</sup></code></li>
</ul>

View File

@@ -0,0 +1,51 @@
<p>给你四个整数&nbsp;<code>length</code>&nbsp;<code>width</code>&nbsp;<code>height</code>&nbsp;&nbsp;<code>mass</code>&nbsp;,分别表示一个箱子的三个维度和质量,请你返回一个表示箱子 <strong>类别</strong> 的字符串。</p>
<ul>
<li>如果满足以下条件,那么箱子是&nbsp;<code>"Bulky"</code>&nbsp;的:
<ul>
<li>箱子 <strong>至少有一个</strong> 维度大于等于 <code>10<sup>4</sup></code>&nbsp;</li>
<li>或者箱子的 <strong>体积</strong> 大于等于&nbsp;<code>10<sup>9</sup></code>&nbsp;</li>
</ul>
</li>
<li>如果箱子的质量大于等于&nbsp;<code>100</code>&nbsp;,那么箱子是&nbsp;<code>"Heavy"</code>&nbsp;的。</li>
<li>如果箱子同时是&nbsp;<code>"Bulky"</code>&nbsp;<code>"Heavy"</code>&nbsp;,那么返回类别为&nbsp;<code>"Both"</code>&nbsp;</li>
<li>如果箱子既不是&nbsp;<code>"Bulky"</code>&nbsp;,也不是&nbsp;<code>"Heavy"</code>&nbsp;,那么返回类别为&nbsp;<code>"Neither"</code>&nbsp;</li>
<li>如果箱子是&nbsp;<code>"Bulky"</code>&nbsp;但不是&nbsp;<code>"Heavy"</code>&nbsp;,那么返回类别为&nbsp;<code>"Bulky"</code>&nbsp;</li>
<li>如果箱子是&nbsp;<code>"Heavy"</code>&nbsp;但不是&nbsp;<code>"Bulky"</code>&nbsp;,那么返回类别为&nbsp;<code>"Heavy"</code>&nbsp;</li>
</ul>
<p><strong>注意</strong>,箱子的体积等于箱子的长度、宽度和高度的乘积。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<b>输入:</b>length = 1000, width = 35, height = 700, mass = 300
<b>输出:</b>"Heavy"
<b>解释:</b>
箱子没有任何维度大于等于 10<sup>4 </sup>
体积为 24500000 &lt;= 10<sup>9 </sup>。所以不能归类为 "Bulky" 。
但是质量 &gt;= 100 ,所以箱子是 "Heavy" 的。
由于箱子不是 "Bulky" 但是是 "Heavy" ,所以我们返回 "Heavy" 。</pre>
<p><strong>示例 2</strong></p>
<pre>
<b>输入:</b>length = 200, width = 50, height = 800, mass = 50
<b>输出:</b>"Neither"
<b>解释:</b>
箱子没有任何维度大于等于 10<sup>4</sup>&nbsp;
体积为 8 * 10<sup>6</sup> &lt;= 10<sup>9</sup>&nbsp;。所以不能归类为 "Bulky" 。
质量小于 100 ,所以不能归类为 "Heavy" 。
由于不属于上述两者任何一类,所以我们返回 "Neither" 。</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= length, width, height &lt;= 10<sup>5</sup></code></li>
<li><code>1 &lt;= mass &lt;= 10<sup>3</sup></code></li>
</ul>

View File

@@ -0,0 +1,47 @@
<p>给你一个按 <strong>非递减顺序</strong> 排列的数组 <code>nums</code> ,返回正整数数目和负整数数目中的最大值。</p>
<ul>
<li>换句话讲,如果 <code>nums</code> 中正整数的数目是 <code>pos</code> ,而负整数的数目是 <code>neg</code> ,返回 <code>pos</code><code>neg</code>二者中的最大值。</li>
</ul>
<p><strong>注意:</strong><code>0</code> 既不是正整数也不是负整数。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>nums = [-2,-1,-1,1,2,3]
<strong>输出:</strong>3
<strong>解释:</strong>共有 3 个正整数和 3 个负整数。计数得到的最大值是 3 。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>nums = [-3,-2,-1,0,0,1,2]
<strong>输出:</strong>3
<strong>解释:</strong>共有 2 个正整数和 3 个负整数。计数得到的最大值是 3 。
</pre>
<p><strong>示例 3</strong></p>
<pre>
<strong>输入:</strong>nums = [5,20,66,1314]
<strong>输出:</strong>4
<strong>解释:</strong>共有 4 个正整数和 0 个负整数。计数得到的最大值是 4 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= nums.length &lt;= 2000</code></li>
<li><code>-2000 &lt;= nums[i] &lt;= 2000</code></li>
<li><code>nums</code><strong>非递减顺序</strong> 排列。</li>
</ul>
<p>&nbsp;</p>
<p><strong>进阶:</strong>你可以设计并实现时间复杂度为 <code>O(log(n))</code> 的算法解决此问题吗?</p>

View File

@@ -0,0 +1,74 @@
<p>共有 <code>k</code> 位工人计划将 <code>n</code> 个箱子从旧仓库移动到新仓库。给你两个整数 <code>n</code><code>k</code>,以及一个二维整数数组 <code>time</code> ,数组的大小为 <code>k x 4</code> ,其中 <code>time[i] = [leftToRight<sub>i</sub>, pickOld<sub>i</sub>, rightToLeft<sub>i</sub>, putNew<sub>i</sub>]</code></p>
<p>一条河将两座仓库分隔,只能通过一座桥通行。旧仓库位于河的右岸,新仓库在河的左岸。开始时,所有 <code>k</code> 位工人都在桥的左侧等待。为了移动这些箱子,第 <code>i</code> 位工人(下标从 <strong>0</strong> 开始)可以:</p>
<ul>
<li>从左岸(新仓库)跨过桥到右岸(旧仓库),用时 <code>leftToRight<sub>i</sub></code> 分钟。</li>
<li>从旧仓库选择一个箱子,并返回到桥边,用时 <code>pickOld<sub>i</sub></code> 分钟。不同工人可以同时搬起所选的箱子。</li>
<li>从右岸(旧仓库)跨过桥到左岸(新仓库),用时 <code>rightToLeft<sub>i</sub></code> 分钟。</li>
<li>将箱子放入新仓库,并返回到桥边,用时 <code>putNew<sub>i</sub></code> 分钟。不同工人可以同时放下所选的箱子。</li>
</ul>
<p>如果满足下面任一条件,则认为工人 <code>i</code><strong>效率低于</strong> 工人 <code>j</code> </p>
<ul>
<li><code>leftToRight<sub>i</sub> + rightToLeft<sub>i</sub> &gt; leftToRight<sub>j</sub> + rightToLeft<sub>j</sub></code></li>
<li><code>leftToRight<sub>i</sub> + rightToLeft<sub>i</sub> == leftToRight<sub>j</sub> + rightToLeft<sub>j</sub></code><code>i &gt; j</code></li>
</ul>
<p>工人通过桥时需要遵循以下规则:</p>
<ul>
<li>如果工人 <code>x</code> 到达桥边时,工人 <code>y</code> 正在过桥,那么工人 <code>x</code> 需要在桥边等待。</li>
<li>如果没有正在过桥的工人,那么在桥右边等待的工人可以先过桥。如果同时有多个工人在右边等待,那么 <strong>效率最低</strong> 的工人会先过桥。</li>
<li>如果没有正在过桥的工人,且桥右边也没有在等待的工人,同时旧仓库还剩下至少一个箱子需要搬运,此时在桥左边的工人可以过桥。如果同时有多个工人在左边等待,那么 <strong>效率最低</strong> 的工人会先过桥。</li>
</ul>
<p>所有 <code>n</code> 个盒子都需要放入新仓库,<span class="text-only" data-eleid="8" style="white-space: pre;">请你返回最后一个搬运箱子的工人 </span><strong><span class="text-only" data-eleid="9" style="white-space: pre;">到达河左岸</span></strong><span class="text-only" data-eleid="10" style="white-space: pre;"> 的时间。</span></p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<pre>
<strong>输入:</strong>n = 1, k = 3, time = [[1,1,2,1],[1,1,3,1],[1,1,4,1]]
<strong>输出:</strong>6
<strong>解释:</strong>
从 0 到 1 :工人 2 从左岸过桥到达右岸。
从 1 到 2 :工人 2 从旧仓库搬起一个箱子。
从 2 到 6 :工人 2 从右岸过桥到达左岸。
从 6 到 7 :工人 2 将箱子放入新仓库。
整个过程在 7 分钟后结束。因为问题关注的是最后一个工人到达左岸的时间,所以返回 6 。
</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<strong>输入:</strong>n = 3, k = 2, time = [[1,9,1,8],[10,10,10,10]]
<strong>输出:</strong>50
<strong>解释:</strong>
从 0 到 10 :工人 1 从左岸过桥到达右岸。
从 10 到 20 :工人 1 从旧仓库搬起一个箱子。
从 10 到 11 :工人 0 从左岸过桥到达右岸。
从 11 到 20 :工人 0 从旧仓库搬起一个箱子。
从 20 到 30 :工人 1 从右岸过桥到达左岸。
从 30 到 40 :工人 1 将箱子放入新仓库。
从 30 到 31 :工人 0 从右岸过桥到达左岸。
从 31 到 39 :工人 0 将箱子放入新仓库。
从 39 到 40 :工人 0 从左岸过桥到达右岸。
从 40 到 49 :工人 0 从旧仓库搬起一个箱子。
从 49 到 50 :工人 0 从右岸过桥到达左岸。
从 50 到 58 :工人 0 将箱子放入新仓库。
整个过程在 58 分钟后结束。因为问题关注的是最后一个工人到达左岸的时间,所以返回 50 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= n, k &lt;= 10<sup>4</sup></code></li>
<li><code>time.length == k</code></li>
<li><code>time[i].length == 4</code></li>
<li><code>1 &lt;= leftToRight<sub>i</sub>, pickOld<sub>i</sub>, rightToLeft<sub>i</sub>, putNew<sub>i</sub> &lt;= 1000</code></li>
</ul>