1
0
mirror of https://gitee.com/coder-xiaomo/leetcode-problemset synced 2025-09-05 15:31:43 +08:00
Code Issues Projects Releases Wiki Activity GitHub Gitee
This commit is contained in:
2023-12-09 01:16:38 +08:00
parent b011971a71
commit 4616f1345d
89 changed files with 24135 additions and 14676 deletions

View File

@@ -0,0 +1,51 @@
<p>给你一个下标从 <strong>0 </strong>开始的 <strong>正整数</strong> 数组 <code>nums</code> 和一个 <strong>正整数</strong> <code>limit</code></p>
<p>在一次操作中,你可以选择任意两个下标 <code>i</code><code>j</code><strong>如果</strong> 满足 <code>|nums[i] - nums[j]| &lt;= limit</code> ,则交换 <code>nums[i]</code><code>nums[j]</code></p>
<p>返回执行任意次操作后能得到的 <strong>字典序最小的数组</strong><em> </em></p>
<p>如果在数组 <code>a</code> 和数组 <code>b</code> 第一个不同的位置上,数组 <code>a</code> 中的对应元素比数组 <code>b</code> 中的对应元素的字典序更小,则认为数组 <code>a</code> 就比数组 <code>b</code> 字典序更小。例如,数组 <code>[2,10,3]</code> 比数组 <code>[10,2,3]</code> 字典序更小,下标 <code>0</code> 处是两个数组第一个不同的位置,且 <code>2 &lt; 10</code></p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<pre>
<strong>输入:</strong>nums = [1,5,3,9,8], limit = 2
<strong>输出:</strong>[1,3,5,8,9]
<strong>解释:</strong>执行 2 次操作:
- 交换 nums[1] 和 nums[2] 。数组变为 [1,3,5,9,8] 。
- 交换 nums[3] 和 nums[4] 。数组变为 [1,3,5,8,9] 。
即便执行更多次操作,也无法得到字典序更小的数组。
注意,执行不同的操作也可能会得到相同的结果。
</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<strong>输入:</strong>nums = [1,7,6,18,2,1], limit = 3
<strong>输出:</strong>[1,6,7,18,1,2]
<strong>解释:</strong>执行 3 次操作:
- 交换 nums[1] 和 nums[2] 。数组变为 [1,6,7,18,2,1] 。
- 交换 nums[0] 和 nums[4] 。数组变为 [2,6,7,18,1,1] 。
- 交换 nums[0] 和 nums[5] 。数组变为 [1,6,7,18,1,2] 。
即便执行更多次操作,也无法得到字典序更小的数组。
</pre>
<p><strong class="example">示例 3</strong></p>
<pre>
<strong>输入:</strong>nums = [1,7,28,19,10], limit = 3
<strong>输出:</strong>[1,7,28,19,10]
<strong>解释:</strong>[1,7,28,19,10] 是字典序最小的数组,因为不管怎么选择下标都无法执行操作。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= nums.length &lt;= 10<sup>5</sup></code></li>
<li><code>1 &lt;= nums[i] &lt;= 10<sup>9</sup></code></li>
<li><code>1 &lt;= limit &lt;= 10<sup>9</sup></code></li>
</ul>

View File

@@ -0,0 +1,31 @@
<p>给你三个字符串 <code>s1</code><code>s2</code><code>s3</code>。 你可以根据需要对这三个字符串执行以下操作 <strong>任意次数</strong> <!-- notionvc: b5178de7-3318-4129-b7d9-726b47e90621 --></p>
<p>在每次操作中,你可以选择其中一个长度至少为 <code>2</code> 的字符串 <!-- notionvc: 3342ac46-33c8-4010-aacd-e58678ce31ef --> 并删除其 <strong>最右位置上</strong> 的字符。</p>
<p>如果存在某种方法能够使这三个字符串相等,请返回使它们相等所需的 <strong>最小</strong> 操作次数;否则,返回 <code>-1</code></p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<pre>
<strong>输入:</strong>s1 = "abc"s2 = "abb"s3 = "ab"
<strong>输出:</strong>2
<strong>解释:</strong>对 s1 和 s2 进行一次操作后,可以得到三个相等的字符串。
可以证明,不可能用少于两次操作使它们相等。</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<strong>输入:</strong>s1 = "dac"s2 = "bac"s3 = "cac"
<strong>输出:</strong>-1
<strong>解释:</strong>因为 s1 和 s2 的最左位置上的字母<!-- notionvc: 47239f7c-eec1-49f8-af79-c206ec88cb07 -->不相等,所以无论进行多少次操作,它们都不可能相等。因此答案是 -1 。</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= s1.length, s2.length, s3.length &lt;= 100</code></li>
<li><code>s1</code><code>s2</code><code>s3</code> 仅由小写英文字母组成。</li>
</ul>

View File

@@ -0,0 +1,46 @@
<p>桌子上有 <code>n</code> 个球,每个球的颜色不是黑色,就是白色。</p>
<p>给你一个长度为 <code>n</code> 、下标从 <strong>0</strong> 开始的二进制字符串 <code>s</code>,其中 <code>1</code><code>0</code> 分别代表黑色和白色的球。</p>
<p>在每一步中,你可以选择两个相邻的球并交换它们。</p>
<p>返回「将所有黑色球都移到右侧,所有白色球都移到左侧所需的 <strong>最小步数</strong>」。</p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<pre>
<strong>输入:</strong>s = "101"
<strong>输出:</strong>1
<strong>解释:</strong>我们可以按以下方式将所有黑色球移到右侧:
- 交换 s[0] 和 s[1]s = "011"。
最开始1 没有都在右侧,需要至少 1 步将其移到右侧。</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<strong>输入:</strong>s = "100"
<strong>输出:</strong>2
<strong>解释:</strong>我们可以按以下方式将所有黑色球移到右侧:
- 交换 s[0] 和 s[1]s = "010"。
- 交换 s[1] 和 s[2]s = "001"。
可以证明所需的最小步数为 2 。
</pre>
<p><strong class="example">示例 3</strong></p>
<pre>
<strong>输入:</strong>s = "0111"
<strong>输出:</strong>0
<strong>解释:</strong>所有黑色球都已经在右侧。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= n == s.length &lt;= 10<sup>5</sup></code></li>
<li><code>s[i]</code> 不是 <code>'0'</code>,就是 <code>'1'</code></li>
</ul>

View File

@@ -0,0 +1,46 @@
<p>给你一个<strong>下标从 0 开始</strong>且大小为 <code>m x n</code> 的整数矩阵 <code>mat</code> 和一个整数 <code>k</code> 。请你将矩阵中的<strong> 奇数</strong> 行循环 <strong></strong><code>k</code> 次,<strong>偶数</strong> 行循环 <strong></strong><code>k</code> 次。</p>
<p>如果初始矩阵和最终矩阵完全相同,则返回 <code>true</code> ,否则返回 <code>false</code></p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<pre>
<strong>输入:</strong>mat = [[1,2,1,2],[5,5,5,5],[6,3,6,3]], k = 2
<strong>输出:</strong>true
<strong>解释:</strong>
<img alt="" src="https://assets.leetcode.com/uploads/2023/10/29/similarmatrix.png" style="width: 500px; height: 117px;" />
初始矩阵如图一所示。
图二表示对奇数行右移一次且对偶数行左移一次后的矩阵状态。
图三是经过两次循环移位后的最终矩阵状态,与初始矩阵相同。
因此,返回 true 。
</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<strong>输入:</strong>mat = [[2,2],[2,2]], k = 3
<strong>输出:</strong>true
<strong>解释:</strong>由于矩阵中的所有值都相等,即使进行循环移位,矩阵仍然保持不变。因此,返回 true 。
</pre>
<p><strong class="example">示例 3</strong></p>
<pre>
<strong>输入:</strong>mat = [[1,2]], k = 1
<strong>输出:</strong>false
<strong>解释:</strong>循环移位一次后mat = [[2,1]],与初始矩阵不相等。因此,返回 false 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= mat.length &lt;= 25</code></li>
<li><code>1 &lt;= mat[i].length &lt;= 25</code></li>
<li><code>1 &lt;= mat[i][j] &lt;= 25</code></li>
<li><code>1 &lt;= k &lt;= 50</code></li>
</ul>

View File

@@ -0,0 +1,42 @@
<p>给你一个下标从 <strong>0</strong> 开始的数组 <code>mountain</code> 。你的任务是找出数组&nbsp;<code>mountain</code> 中的所有 <strong>峰值</strong></p>
<p>以数组形式返回给定数组中 <strong>峰值</strong> 的下标,<strong>顺序不限</strong></p>
<p><strong>注意:</strong></p>
<ul>
<li><strong>峰值</strong> 是指一个严格大于其相邻元素的元素。</li>
<li>数组的第一个和最后一个元素 <strong></strong> 是峰值。</li>
</ul>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<pre>
<strong>输入:</strong>mountain = [2,4,4]
<strong>输出:</strong>[]
<strong>解释:</strong>mountain[0] 和 mountain[2] 不可能是峰值,因为它们是数组的第一个和最后一个元素。
mountain[1] 也不可能是峰值,因为它不严格大于 mountain[2] 。
因此,答案为 [] 。
</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<strong>输入:</strong>mountain = [1,4,3,8,5]
<strong>输出:</strong>[1,3]
<strong>解释:</strong>mountain[0] 和 mountain[4] 不可能是峰值,因为它们是数组的第一个和最后一个元素。
mountain[2] 也不可能是峰值,因为它不严格大于 mountain[3] 和 mountain[1] 。
但是 mountain[1] 和 mountain[3] 严格大于它们的相邻元素。
因此,答案是 [1,3] 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>3 &lt;= mountain.length &lt;= 100</code></li>
<li><code>1 &lt;= mountain[i] &lt;= 100</code></li>
</ul>

View File

@@ -0,0 +1,49 @@
<p>给你一个下标从 <strong>0</strong>&nbsp;开始的正整数数组&nbsp;<code>heights</code>&nbsp;,其中&nbsp;<code>heights[i]</code>&nbsp;表示第 <code>i</code>&nbsp;栋建筑的高度。</p>
<p>如果一个人在建筑&nbsp;<code>i</code>&nbsp;,且存在&nbsp;<code>i &lt; j</code>&nbsp;的建筑&nbsp;<code>j</code>&nbsp;满足&nbsp;<code>heights[i] &lt; heights[j]</code>&nbsp;,那么这个人可以移动到建筑&nbsp;<code>j</code>&nbsp;</p>
<p>给你另外一个数组&nbsp;<code>queries</code>&nbsp;,其中&nbsp;<code>queries[i] = [a<sub>i</sub>, b<sub>i</sub>]</code>&nbsp;。第&nbsp;<code>i</code>&nbsp;个查询中Alice 在建筑&nbsp;<code>a<sub>i</sub></code> Bob 在建筑&nbsp;<code>b<sub>i</sub></code><sub>&nbsp;</sub></p>
<p>请你能返回一个数组&nbsp;<code>ans</code>&nbsp;,其中&nbsp;<code>ans[i]</code>&nbsp;是第&nbsp;<code>i</code>&nbsp;个查询中Alice 和 Bob 可以相遇的&nbsp;<strong>最左边的建筑</strong>&nbsp;。如果对于查询&nbsp;<code>i</code>&nbsp;Alice<em> </em><em> </em>Bob 不能相遇,令&nbsp;<code>ans[i]</code>&nbsp;<code>-1</code>&nbsp;</p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<pre>
<b>输入:</b>heights = [6,4,8,5,2,7], queries = [[0,1],[0,3],[2,4],[3,4],[2,2]]
<b>输出:</b>[2,5,-1,5,2]
<b>解释:</b>第一个查询中Alice 和 Bob 可以移动到建筑 2 ,因为 heights[0] &lt; heights[2] 且 heights[1] &lt; heights[2] 。
第二个查询中Alice 和 Bob 可以移动到建筑 5 ,因为 heights[0] &lt; heights[5] 且 heights[3] &lt; heights[5] 。
第三个查询中Alice 无法与 Bob 相遇,因为 Alice 不能移动到任何其他建筑。
第四个查询中Alice 和 Bob 可以移动到建筑 5 ,因为 heights[3] &lt; heights[5] 且 heights[4] &lt; heights[5] 。
第五个查询中Alice 和 Bob 已经在同一栋建筑中。
对于 ans[i] != -1 ans[i] 是 Alice 和 Bob 可以相遇的建筑中最左边建筑的下标。
对于 ans[i] == -1 ,不存在 Alice 和 Bob 可以相遇的建筑。
</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<b>输入:</b>heights = [5,3,8,2,6,1,4,6], queries = [[0,7],[3,5],[5,2],[3,0],[1,6]]
<b>输出:</b>[7,6,-1,4,6]
<strong>解释:</strong>第一个查询中Alice 可以直接移动到 Bob 的建筑,因为 heights[0] &lt; heights[7] 。
第二个查询中Alice 和 Bob 可以移动到建筑 6 ,因为 heights[3] &lt; heights[6] 且 heights[5] &lt; heights[6] 。
第三个查询中Alice 无法与 Bob 相遇,因为 Bob 不能移动到任何其他建筑。
第四个查询中Alice 和 Bob 可以移动到建筑 4 ,因为 heights[3] &lt; heights[4] 且 heights[0] &lt; heights[4] 。
第五个查询中Alice 可以直接移动到 Bob 的建筑,因为 heights[1] &lt; heights[6] 。
对于 ans[i] != -1 ans[i] 是 Alice 和 Bob 可以相遇的建筑中最左边建筑的下标。
对于 ans[i] == -1 ,不存在 Alice 和 Bob 可以相遇的建筑。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= heights.length &lt;= 5 * 10<sup>4</sup></code></li>
<li><code>1 &lt;= heights[i] &lt;= 10<sup>9</sup></code></li>
<li><code>1 &lt;= queries.length &lt;= 5 * 10<sup>4</sup></code></li>
<li><code>queries[i] = [a<sub>i</sub>, b<sub>i</sub>]</code></li>
<li><code>0 &lt;= a<sub>i</sub>, b<sub>i</sub> &lt;= heights.length - 1</code></li>
</ul>

View File

@@ -0,0 +1,48 @@
<p>给你一个下标从 <strong>0</strong>&nbsp;开始的整数数组&nbsp;<code>nums</code>&nbsp;</p>
<p>你可以执行任意次操作。每次操作中,你需要选择一个 <strong>子数组</strong>&nbsp;,并将这个子数组用它所包含元素的 <strong></strong>&nbsp;替换。比方说,给定数组是&nbsp;<code>[1,3,5,6]</code>&nbsp;,你可以选择子数组&nbsp;<code>[3,5]</code>&nbsp;,用子数组的和 <code>8</code>&nbsp;替换掉子数组,然后数组会变为&nbsp;<code>[1,8,6]</code>&nbsp;</p>
<p>请你返回执行任意次操作以后,可以得到的 <strong>最长非递减</strong>&nbsp;数组的长度。</p>
<p><strong>子数组</strong>&nbsp;指的是一个数组中一段连续 <strong>非空</strong>&nbsp;的元素序列。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<b>输入:</b>nums = [5,2,2]
<b>输出:</b>1
<strong>解释:</strong>这个长度为 3 的数组不是非递减的。
我们有 2 种方案使数组长度为 2 。
第一种,选择子数组 [2,2] ,对数组执行操作后得到 [5,4] 。
第二种,选择子数组 [5,2] ,对数组执行操作后得到 [7,2] 。
这两种方案中,数组最后都不是 <strong>非递减</strong>&nbsp;的,所以不是可行的答案。
如果我们选择子数组 [5,2,2] ,并将它替换为 [9] ,数组变成非递减的。
所以答案为 1 。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<b>输入:</b>nums = [1,2,3,4]
<b>输出:</b>4
<b>解释:</b>数组已经是非递减的。所以答案为 4 。
</pre>
<p><strong>示例 3</strong></p>
<pre>
<b>输入:</b>nums = [4,3,2,6]
<b>输出:</b>3
<b>解释:</b>将 [3,2] 替换为 [5] ,得到数组 [4,5,6] ,它是非递减的。
最大可能的答案为 3 。</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= nums.length &lt;= 10<sup>5</sup></code></li>
<li><code>1 &lt;= nums[i] &lt;= 10<sup>5</sup></code></li>
</ul>

View File

@@ -0,0 +1,89 @@
<p>给你一个网格图,由&nbsp;<code>n + 2</code>&nbsp;<strong>横线段</strong>&nbsp;&nbsp;<code>m + 2</code>&nbsp;&nbsp;<strong>竖线段</strong>&nbsp;组成,一开始所有区域均为&nbsp;<code>1 x 1</code>&nbsp;的单元格。</p>
<p>所有线段的编号从 <strong>1</strong>&nbsp;开始。</p>
<p>给你两个整数&nbsp;<code>n</code>&nbsp;<code>m</code>&nbsp;</p>
<p>同时给你两个整数数组&nbsp;<code>hBars</code>&nbsp;<code>vBars</code>&nbsp;</p>
<ul>
<li><code>hBars</code> 包含区间&nbsp;<code>[2, n + 1]</code>&nbsp;&nbsp;<strong>互不相同</strong>&nbsp;的横线段编号。</li>
<li><code>vBars</code>&nbsp;包含&nbsp;<code>[2, m + 1]</code>&nbsp;&nbsp;<strong>互不相同的</strong>&nbsp;竖线段编号。</li>
</ul>
<p>如果满足以下条件之一,你可以 <strong>移除</strong>&nbsp;两个数组中的部分线段:</p>
<ul>
<li>如果移除的是横线段,它必须是&nbsp;<code>hBars</code>&nbsp;中的值。</li>
<li>如果移除的是竖线段,它必须是&nbsp;<code>vBars</code>&nbsp;中的值。</li>
</ul>
<p>请你返回移除一些线段后(<strong>可能不移除任何线段)</strong>,剩余网格图中 <strong>最大正方形</strong>&nbsp;空洞的面积,正方形空洞的意思是正方形 <strong>内部</strong> 不含有任何线段。</p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<p><img alt="" src="https://assets.leetcode.com/uploads/2023/11/05/screenshot-from-2023-11-05-22-40-25.png" style="width: 411px; height: 220px;" /></p>
<pre>
<b>输入:</b>n = 2, m = 1, hBars = [2,3], vBars = [2]
<b>输出:</b>4
<b>解释:</b>左边的图是一开始的网格图。
横线编号的范围是区间 [1,4] ,竖线编号的范围是区间 [1,3] 。
可以移除的横线段为 [2,3] ,竖线段为 [2] 。
一种得到最大正方形面积的方法是移除横线段 2 和竖线段 2 。
操作后得到的网格图如右图所示。
正方形空洞面积为 4。
无法得到面积大于 4 的正方形空洞。
所以答案为 4 。
</pre>
<p><strong class="example">示例 2</strong></p>
<p><img alt="" src="https://assets.leetcode.com/uploads/2023/11/04/screenshot-from-2023-11-04-17-01-02.png" style="width: 368px; height: 145px;" /></p>
<pre>
<b>输入:</b>n = 1, m = 1, hBars = [2], vBars = [2]
<b>输出:</b>4
<b>解释:</b>左边的图是一开始的网格图。
横线编号的范围是区间 [1,3] ,竖线编号的范围是区间 [1,3] 。
可以移除的横线段为 [2] ,竖线段为 [2] 。
一种得到最大正方形面积的方法是移除横线段 2 和竖线段 2 。
操作后得到的网格图如右图所示。
正方形空洞面积为 4。
无法得到面积大于 4 的正方形空洞。
所以答案为 4 。
</pre>
<p><strong class="example">示例 3</strong></p>
<p><img alt="" src="https://assets.leetcode.com/uploads/2023/11/05/screenshot-from-2023-11-05-22-33-35.png" style="width: 648px; height: 218px;" /></p>
<pre>
<b>输入:</b>n = 2, m = 3, hBars = [2,3], vBars = [2,3,4]
<b>输出:</b>9
<b>解释:</b>左边的图是一开始的网格图。
横线编号的范围是区间 [1,4] ,竖线编号的范围是区间 [1,5] 。
可以移除的横线段为 [2,3] ,竖线段为 [2,3,4] 。
一种得到最大正方形面积的方法是移除横线段 2、3 和竖线段 3、4 。
操作后得到的网格图如右图所示。
正方形空洞面积为 9。
无法得到面积大于 9 的正方形空洞。
所以答案为 9 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= n &lt;= 10<sup>9</sup></code></li>
<li><code>1 &lt;= m &lt;= 10<sup>9</sup></code></li>
<li><code>1 &lt;= hBars.length &lt;= 100</code></li>
<li><code>2 &lt;= hBars[i] &lt;= n + 1</code></li>
<li><code>1 &lt;= vBars.length &lt;= 100</code></li>
<li><code>2 &lt;= vBars[i] &lt;= m + 1</code></li>
<li><code>hBars</code>&nbsp;中的值互不相同。</li>
<li><code>vBars</code> 中的值互不相同。</li>
</ul>

View File

@@ -0,0 +1,42 @@
<p>给你三个整数&nbsp;<code>a</code>&nbsp;<code>b</code>&nbsp;&nbsp;<code>n</code>&nbsp;,请你返回&nbsp;<code>(a XOR x) * (b XOR x)</code>&nbsp;&nbsp;<strong>最大值</strong>&nbsp;<code>x</code>&nbsp;需要满足 <code>0 &lt;= x &lt; 2<sup>n</sup></code></p>
<p>由于答案可能会很大,返回它对&nbsp;<code>10<sup>9 </sup>+ 7</code>&nbsp;<strong>取余</strong>&nbsp;后的结果。</p>
<p><strong>注意</strong><code>XOR</code>&nbsp;是按位异或操作。</p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<pre>
<b>输入:</b>a = 12, b = 5, n = 4
<b>输出:</b>98
<b>解释:</b>当 x = 2 时,(a XOR x) = 14 且 (b XOR x) = 7 。所以,(a XOR x) * (b XOR x) = 98 。
98 是所有满足 0 &lt;= x &lt; 2<sup>n </sup>中 (a XOR x) * (b XOR x) 的最大值。
</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<b>输入:</b>a = 6, b = 7 , n = 5
<b>输出:</b>930
<b>解释:</b>当 x = 25 时,(a XOR x) = 31 且 (b XOR x) = 30 。所以,(a XOR x) * (b XOR x) = 930 。
930 是所有满足 0 &lt;= x &lt; 2<sup>n </sup>中 (a XOR x) * (b XOR x) 的最大值。</pre>
<p><strong class="example">示例 3</strong></p>
<pre>
<b>输入:</b>a = 1, b = 6, n = 3
<b>输出:</b>12
<b>解释: </b>当 x = 5 时,(a XOR x) = 4 且 (b XOR x) = 3 。所以,(a XOR x) * (b XOR x) = 12 。
12 是所有满足 0 &lt;= x &lt; 2<sup>n </sup>中 (a XOR x) * (b XOR x) 的最大值。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>0 &lt;= a, b &lt; 2<sup>50</sup></code></li>
<li><code>0 &lt;= n &lt;= 50</code></li>
</ul>

View File

@@ -0,0 +1,42 @@
<p>给你一个下标从 <strong>0</strong>&nbsp;开始的字符串数组&nbsp;<code>words</code>&nbsp;和一个字符&nbsp;<code>x</code>&nbsp;</p>
<p>请你返回一个 <strong>下标数组</strong>&nbsp;,表示下标在数组中对应的单词包含字符 <code>x</code>&nbsp;</p>
<p><b>注意</b>&nbsp;,返回的数组可以是&nbsp;<strong>任意</strong>&nbsp;顺序。</p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<pre>
<b>输入:</b>words = ["leet","code"], x = "e"
<b>输出:</b>[0,1]
<b>解释:</b>"e" 在两个单词中都出现了:"l<em><strong>ee</strong></em>t" 和 "cod<em><strong>e</strong></em>" 。所以我们返回下标 0 和 1 。
</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<b>输入:</b>words = ["abc","bcd","aaaa","cbc"], x = "a"
<b>输出:</b>[0,2]
<b>解释:</b>"a" 在 "<em><strong>a</strong></em>bc" 和 "<em><strong>aaaa</strong></em>" 中出现了,所以我们返回下标 0 和 2 。
</pre>
<p><strong class="example">示例 3</strong></p>
<pre>
<b>输入:</b>words = ["abc","bcd","aaaa","cbc"], x = "z"
<b>输出:</b>[]
<b>解释:</b>"z" 没有在任何单词中出现。所以我们返回空数组。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= words.length &lt;= 50</code></li>
<li><code>1 &lt;= words[i].length &lt;= 50</code></li>
<li><code>x</code>&nbsp;是一个小写英文字母。</li>
<li><code>words[i]</code>&nbsp;只包含小写英文字母。</li>
</ul>

View File

@@ -0,0 +1,40 @@
<p>给你一个字符串&nbsp;<code>word</code>&nbsp;和一个整数 <code>k</code>&nbsp;</p>
<p>如果&nbsp;<code>word</code>&nbsp;的一个子字符串 <code>s</code>&nbsp;满足以下条件,我们称它是 <strong>完全字符串:</strong></p>
<ul>
<li><code>s</code>&nbsp;中每个字符 <strong>恰好</strong>&nbsp;出现 <code>k</code>&nbsp;次。</li>
<li>相邻字符在字母表中的顺序 <strong>至多</strong>&nbsp;相差&nbsp;<code>2</code>&nbsp;。也就是说,<code>s</code>&nbsp;中两个相邻字符&nbsp;<code>c1</code>&nbsp;<code>c2</code>&nbsp;,它们在字母表中的位置相差<strong>&nbsp;至多</strong>&nbsp;<code>2</code></li>
</ul>
<p>请你返回 <code>word</code>&nbsp;<strong>完全</strong>&nbsp;子字符串的数目。</p>
<p><strong>子字符串</strong>&nbsp;指的是一个字符串中一段连续 <strong>非空</strong>&nbsp;的字符序列。</p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<pre>
<b>输入:</b>word = "igigee", k = 2
<b>输出:</b>3
<b>解释:</b>完全子字符串需要满足每个字符恰好出现 2 次,且相邻字符相差至多为 2 <em><strong>igig</strong></em>ee, igig<strong style="font-style: italic;">ee</strong>, <em><strong>igigee</strong>&nbsp;</em>
</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<b>输入:</b>word = "aaabbbccc", k = 3
<b>输出:</b>6
<b>解释:</b>完全子字符串需要满足每个字符恰好出现 3 次,且相邻字符相差至多为 2 <em><strong>aaa</strong></em>bbbccc, aaa<em><strong>bbb</strong></em>ccc, aaabbb<em><strong>ccc</strong></em>, <em><strong>aaabbb</strong></em>ccc, aaa<em><strong>bbbccc</strong></em>, <em><strong>aaabbbccc </strong></em>
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= word.length &lt;= 10<sup>5</sup></code></li>
<li><code>word</code>&nbsp;只包含小写英文字母。</li>
<li><code>1 &lt;= k &lt;= word.length</code></li>
</ul>

View File

@@ -0,0 +1,49 @@
<p>给你一个整数&nbsp;<code>n</code>&nbsp;和一个下标从 <strong>0</strong>&nbsp;开始的整数数组&nbsp;<code>sick</code>&nbsp;,数组按 <strong>升序</strong>&nbsp;排序。</p>
<p>&nbsp;<code>n</code>&nbsp;位小朋友站成一排,按顺序编号为 <code>0</code>&nbsp;<code>n - 1</code>&nbsp;。数组&nbsp;<code>sick</code>&nbsp;包含一开始得了感冒的小朋友的位置。如果位置为&nbsp;<code>i</code>&nbsp;的小朋友得了感冒,他会传染给下标为 <code>i - 1</code>&nbsp;或者 <code>i + 1</code>&nbsp;的小朋友,<strong>前提</strong> 是被传染的小朋友存在且还没有得感冒。每一秒中, <strong>至多一位</strong>&nbsp;还没感冒的小朋友会被传染。</p>
<p>经过有限的秒数后,队列中所有小朋友都会感冒。<strong>感冒序列</strong>&nbsp;指的是 <strong>所有</strong>&nbsp;一开始没有感冒的小朋友最后得感冒的顺序序列。请你返回所有感冒序列的数目。</p>
<p>由于答案可能很大,请你将答案对&nbsp;<code>10<sup>9</sup> + 7</code>&nbsp;取余后返回。</p>
<p><b>注意</b>,感冒序列 <strong></strong> 包含一开始就得了感冒的小朋友的下标。</p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<pre>
<b>输入:</b>n = 5, sick = [0,4]
<b>输出:</b>4
<b>解释:</b>一开始,下标为 1 2 和 3 的小朋友没有感冒。总共有 4 个可能的感冒序列:
- 一开始,下标为 1 和 3 的小朋友可以被传染,因为他们分别挨着有感冒的小朋友 0 和 4 ,令下标为 1 的小朋友先被传染。
然后,下标为 2 的小朋友挨着感冒的小朋友 1 ,下标为 3 的小朋友挨着感冒的小朋友 4 ,两位小朋友都可以被传染,令下标为 2 的小朋友被传染。
最后,下标为 3 的小朋友被传染,因为他挨着感冒的小朋友 2 和 4 ,感冒序列为 [1,2,3] 。
- 一开始,下标为 1 和 3 的小朋友可以被传染,因为他们分别挨着感冒的小朋友 0 和 4 ,令下标为 1 的小朋友先被传染。
然后,下标为 2 的小朋友挨着感冒的小朋友 1 ,下标为 3 的小朋友挨着感冒的小朋友 4 ,两位小朋友都可以被传染,令下标为 3 的小朋友被传染。
最后,下标为 2 的小朋友被传染,因为他挨着感冒的小朋友 1 和 3 ,感冒序列为 [1,3,2] 。
- 感冒序列 [3,1,2] ,被传染的顺序:[<strong><em>0</em></strong>,1,2,3,<strong><em>4</em></strong>] =&gt; [<strong><em>0</em></strong>,1,2,<strong><em>3</em></strong>,<strong><em>4</em></strong>] =&gt; [<strong><em>0</em></strong>,<strong><em>1</em></strong>,2,<em><strong>3</strong></em>,<strong><em>4</em></strong>] =&gt; [<strong><em>0</em></strong>,<strong><em>1</em></strong>,<strong><em>2</em></strong>,<strong><em>3</em></strong>,<strong><em>4</em></strong>] 。
- 感冒序列 [3,2,1] ,被传染的顺序:[<strong><em>0</em></strong>,1,2,3,<strong><em>4</em></strong>] =&gt; [<strong><em>0</em></strong>,1,2,<strong><em>3</em></strong>,<strong><em>4</em></strong>] =&gt; [<strong><em>0</em></strong>,1,<strong><em>2</em></strong>,<strong><em>3</em></strong>,<strong><em>4</em></strong>] =&gt; [<strong><em>0</em></strong>,<strong><em>1</em></strong>,<strong><em>2</em></strong>,<strong><em>3</em></strong>,<strong><em>4</em></strong>] 。
</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<b>输入:</b>n = 4, sick = [1]
<b>输出:</b>3
<b>解释:</b>一开始,下标为 0 2 和 3 的小朋友没有感冒。总共有 3 个可能的感冒序列:
- 感冒序列 [0,2,3] ,被传染的顺序:[0,<strong><em>1</em></strong>,2,3] =&gt; [<strong><em>0</em></strong>,<strong><em>1</em></strong>,2,3] =&gt; [<strong><em>0</em></strong>,<strong><em>1</em></strong>,<strong><em>2</em></strong>,3] =&gt; [<strong><em>0</em></strong>,<strong><em>1</em></strong>,<strong><em>2</em></strong>,<strong><em>3</em></strong>] 。
- 感冒序列 [2,0,3] ,被传染的顺序:[0,<strong><em>1</em></strong>,2,3] =&gt; [0,<strong><em>1</em></strong>,<strong><em>2</em></strong>,3] =&gt; [<strong><em>0</em></strong>,<strong><em>1</em></strong>,<strong><em>2</em></strong>,3] =&gt; [<strong><em>0</em></strong>,<strong><em>1</em></strong>,<strong><em>2</em></strong>,<strong><em>3</em></strong>] 。
- 感冒序列 [2,3,0] ,被传染的顺序:[0,<strong><em>1</em></strong>,2,3] =&gt; [0,<strong><em>1</em></strong>,<strong><em>2</em></strong>,3] =&gt; [0,<strong><em>1</em></strong>,<strong><em>2</em></strong>,<strong><em>3</em></strong>] =&gt; [<strong><em>0</em></strong>,<strong><em>1</em></strong>,<strong><em>2</em></strong>,<strong><em>3</em></strong>] 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>2 &lt;= n &lt;= 10<sup>5</sup></code></li>
<li><code>1 &lt;= sick.length &lt;= n - 1</code></li>
<li><code>0 &lt;= sick[i] &lt;= n - 1</code></li>
<li><code>sick</code>&nbsp;按升序排列。</li>
</ul>

View File

@@ -0,0 +1,63 @@
<p>给你一个字符串 <code>s</code> 和一个正整数 <code>k</code></p>
<p><code>vowels</code><code>consonants</code> 分别表示字符串中元音字母和辅音字母的数量。</p>
<p>如果某个字符串满足以下条件,则称其为 <strong>美丽字符串</strong> </p>
<ul>
<li><code>vowels == consonants</code>,即元音字母和辅音字母的数量相等。</li>
<li><code>(vowels * consonants) % k == 0</code>,即元音字母和辅音字母的数量的乘积能被 <code>k</code> 整除。</li>
</ul>
<p>返回字符串 <code>s</code><strong>非空美丽子字符串</strong> 的数量。</p>
<p>子字符串是字符串中的一个连续字符序列。</p>
<p>英语中的<strong> 元音字母 </strong><code>'a'</code><code>'e'</code><code>'i'</code><code>'o'</code><code>'u'</code></p>
<p>英语中的<strong> 辅音字母 </strong>为除了元音字母之外的所有字母。</p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<pre>
<strong>输入:</strong>s = "baeyh", k = 2
<strong>输出:</strong>2
<strong>解释:</strong>字符串 s 中有 2 个美丽子字符串。
- 子字符串 "b<em><strong>aeyh</strong></em>"vowels = 2["a","e"]consonants = 2["y","h"])。
可以看出字符串 "aeyh" 是美丽字符串,因为 vowels == consonants 且 vowels * consonants % k == 0 。
- 子字符串 "<em><strong>baey</strong></em>h"vowels = 2["a","e"]consonants = 2["b","y"])。
可以看出字符串 "baey" 是美丽字符串,因为 vowels == consonants 且 vowels * consonants % k == 0 。
可以证明字符串 s 中只有 2 个美丽子字符串。
</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<strong>输入:</strong>s = "abba", k = 1
<strong>输出:</strong>3
<strong>解释:</strong>字符串 s 中有 3 个美丽子字符串。
- 子字符串 "<strong><em>ab</em></strong>ba"vowels = 1["a"]consonants = 1["b"])。
- 子字符串 "ab<strong><em>ba</em></strong>"vowels = 1["a"]consonants = 1["b"])。
- 子字符串 "<em><strong>abba</strong></em>"vowels = 2["a","a"]consonants = 2["b","b"])。
可以证明字符串 s 中只有 3 个美丽子字符串。
</pre>
<p><strong class="example">示例 3</strong></p>
<pre>
<strong>输入:</strong>s = "bcdf", k = 1
<strong>输出:</strong>0
<strong>解释:</strong>字符串 s 中没有美丽子字符串。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= s.length &lt;= 1000</code></li>
<li><code>1 &lt;= k &lt;= 1000</code></li>
<li><code>s</code> 仅由小写英文字母组成。</li>
</ul>

View File

@@ -0,0 +1,63 @@
<p>给你一个字符串 <code>s</code> 和一个正整数 <code>k</code></p>
<p><code>vowels</code><code>consonants</code> 分别表示字符串中元音字母和辅音字母的数量。</p>
<p>如果某个字符串满足以下条件,则称其为 <strong>美丽字符串</strong> </p>
<ul>
<li><code>vowels == consonants</code>,即元音字母和辅音字母的数量相等。</li>
<li><code>(vowels * consonants) % k == 0</code>,即元音字母和辅音字母的数量的乘积能被 <code>k</code> 整除。</li>
</ul>
<p>返回字符串 <code>s</code><strong>非空美丽子字符串</strong> 的数量。</p>
<p>子字符串是字符串中的一个连续字符序列。</p>
<p>英语中的<strong> 元音字母 </strong><code>'a'</code><code>'e'</code><code>'i'</code><code>'o'</code><code>'u'</code></p>
<p>英语中的<strong> 辅音字母 </strong>为除了元音字母之外的所有字母。</p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<pre>
<strong>输入:</strong>s = "baeyh", k = 2
<strong>输出:</strong>2
<strong>解释:</strong>字符串 s 中有 2 个美丽子字符串。
- 子字符串 "b<em><strong>aeyh</strong></em>"vowels = 2["a","e"]consonants = 2["y","h"])。
可以看出字符串 "aeyh" 是美丽字符串,因为 vowels == consonants 且 vowels * consonants % k == 0 。
- 子字符串 "<em><strong>baey</strong></em>h"vowels = 2["a","e"]consonants = 2["b","y"])。
可以看出字符串 "baey" 是美丽字符串,因为 vowels == consonants 且 vowels * consonants % k == 0 。
可以证明字符串 s 中只有 2 个美丽子字符串。
</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<strong>输入:</strong>s = "abba", k = 1
<strong>输出:</strong>3
<strong>解释:</strong>字符串 s 中有 3 个美丽子字符串。
- 子字符串 "<strong><em>ab</em></strong>ba"vowels = 1["a"]consonants = 1["b"])。
- 子字符串 "ab<strong><em>ba</em></strong>"vowels = 1["a"]consonants = 1["b"])。
- 子字符串 "<em><strong>abba</strong></em>"vowels = 2["a","a"]consonants = 2["b","b"])。
可以证明字符串 s 中只有 3 个美丽子字符串。
</pre>
<p><strong class="example">示例 3</strong></p>
<pre>
<strong>输入:</strong>s = "bcdf", k = 1
<strong>输出:</strong>0
<strong>解释:</strong>字符串 s 中没有美丽子字符串。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= s.length &lt;= 5 * 10<sup>4</sup></code></li>
<li><code>1 &lt;= k &lt;= 1000</code></li>
<li><code>s</code> 仅由小写英文字母组成。</li>
</ul>

View File

@@ -0,0 +1,50 @@
<p>你在一个水果超市里,货架上摆满了玲琅满目的奇珍异果。</p>
<p>给你一个下标从 <strong>1</strong>&nbsp;开始的数组&nbsp;<code>prices</code>&nbsp;,其中&nbsp;<code>prices[i]</code>&nbsp;表示你购买第 <code>i</code>&nbsp;个水果需要花费的金币数目。</p>
<p>水果超市有如下促销活动:</p>
<ul>
<li>如果你花费 <code>price[i]</code>&nbsp;购买了水果&nbsp;<code>i</code>&nbsp;,那么接下来的 <code>i</code>&nbsp;个水果你都可以免费获得。</li>
</ul>
<p><strong>注意</strong>&nbsp;,即使你&nbsp;<strong>可以</strong>&nbsp;免费获得水果&nbsp;<code>j</code>&nbsp;,你仍然可以花费&nbsp;<code>prices[j]</code>&nbsp;个金币去购买它以便能免费获得接下来的 <code>j</code>&nbsp;个水果。</p>
<p>请你返回获得所有水果所需要的 <strong>最少</strong>&nbsp;金币数。</p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<pre>
<b>输入:</b>prices = [3,1,2]
<b>输出:</b>4
<b>解释</b><strong></strong>你可以按如下方法获得所有水果:
- 花 3 个金币购买水果 1 ,然后免费获得水果 2 。
- 花 1 个金币购买水果 2 ,然后免费获得水果 3 。
- 免费获得水果 3 。
注意,虽然你可以免费获得水果 2 ,但你还是花 1 个金币去购买它,因为这样的总花费最少。
购买所有水果需要最少花费 4 个金币。
</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<b>输入:</b>prices = [1,10,1,1]
<b>输出:</b>2
<b>解释:</b>你可以按如下方法获得所有水果:
- 花 1 个金币购买水果 1 ,然后免费获得水果 2 。
- 免费获得水果 2 。
- 花 1 个金币购买水果 3 ,然后免费获得水果 4 。
- 免费获得水果 4 。
购买所有水果需要最少花费 2 个金币。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= prices.length &lt;= 1000</code></li>
<li><code>1 &lt;= prices[i] &lt;= 10<sup>5</sup></code></li>
</ul>

View File

@@ -0,0 +1,45 @@
<p>给你一个下标从 <strong>0 </strong>开始的整数数组 <code>coins</code>,表示可用的硬币的面值,以及一个整数 <code>target</code></p>
<p>如果存在某个 <code>coins</code> 的子序列总和为 <code>x</code>,那么整数 <code>x</code> 就是一个 <strong>可取得的金额 </strong></p>
<p>返回需要添加到数组中的<strong> 任意面值 </strong>硬币的 <strong>最小数量 </strong>,使范围 <code>[1, target]</code> 内的每个整数都属于 <strong>可取得的金额</strong></p>
<p>数组的 <strong>子序列</strong> 是通过删除原始数组的一些(<strong>可能不删除</strong>)元素而形成的新的 <strong>非空</strong> 数组,删除过程不会改变剩余元素的相对位置。</p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<pre>
<strong>输入:</strong>coins = [1,4,10], target = 19
<strong>输出:</strong>2
<strong>解释:</strong>需要添加面值为 2 和 8 的硬币各一枚,得到硬币数组 [1,2,4,8,10] 。
可以证明从 1 到 19 的所有整数都可由数组中的硬币组合得到,且需要添加到数组中的硬币数目最小为 2 。
</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<strong>输入:</strong>coins = [1,4,10,5,7,19], target = 19
<strong>输出:</strong>1
<strong>解释:</strong>只需要添加一枚面值为 2 的硬币,得到硬币数组 [1,2,4,5,7,10,19] 。
可以证明从 1 到 19 的所有整数都可由数组中的硬币组合得到,且需要添加到数组中的硬币数目最小为 1 。</pre>
<p><strong class="example">示例 3</strong></p>
<pre>
<strong>输入:</strong>coins = [1,1,1], target = 20
<strong>输出:</strong>3
<strong>解释:</strong>
需要添加面值为 4 、8 和 16 的硬币各一枚,得到硬币数组 [1,1,1,4,8,16] 。
可以证明从 1 到 20 的所有整数都可由数组中的硬币组合得到,且需要添加到数组中的硬币数目最小为 3 。</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= target &lt;= 10<sup>5</sup></code></li>
<li><code>1 &lt;= coins.length &lt;= 10<sup>5</sup></code></li>
<li><code>1 &lt;= coins[i] &lt;= target</code></li>
</ul>