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:
2022-10-07 21:03:28 +08:00
parent b43009ddf3
commit ee13c73307
59 changed files with 18268 additions and 12348 deletions

View File

@@ -0,0 +1,42 @@
力扣嘉年华同样准备了纪念品展位,参观者只需要集齐 `helloleetcode``13` 张字母卡片即可获得力扣纪念章。
在展位上有一些由字母卡片拼成的单词,`words[i][j]` 表示第 `i` 个单词的第 `j` 个字母。
你可以从这些单词中取出一些卡片,但每次拿取卡片都需要消耗游戏代币,规则如下:
- 从一个单词中取一个字母所需要的代币数量,为该字母左边和右边字母数量之积
- 可以从一个单词中多次取字母,每个字母仅可被取一次
> 例如:从 `example` 中取出字母 `a`,需要消耗代币 `2*4=8`,字母取出后单词变为 `exmple`
再从中取出字母 `m`,需要消耗代币 `2*3=6`,字母取出后单词变为 `exple`
请返回取得 `helloleetcode` 这些字母需要消耗代币的 **最少** 数量。如果无法取得,返回 `-1`
**注意:**
- 取出字母的顺序没有要求
- 取出的所有字母恰好可以拼成 `helloleetcode`
**示例 1**
>输入:`words = ["hold","engineer","cost","level"]`

View File

@@ -0,0 +1,26 @@
<p>给你两个正整数 <code>a</code><code>b</code> ,返回 <code>a</code><code>b</code><strong></strong> 因子的数目。</p>
<p>如果 <code>x</code> 可以同时整除 <code>a</code><code>b</code> ,则认为 <code>x</code><code>a</code><code>b</code> 的一个 <strong>公因子</strong></p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><strong>输入:</strong>a = 12, b = 6
<strong>输出:</strong>4
<strong>解释:</strong>12 和 6 的公因子是 1、2、3、6 。
</pre>
<p><strong>示例 2</strong></p>
<pre><strong>输入:</strong>a = 25, b = 30
<strong>输出:</strong>2
<strong>解释:</strong>25 和 30 的公因子是 1、5 。</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= a, b &lt;= 1000</code></li>
</ul>

View File

@@ -0,0 +1,35 @@
<p>给你一个下标从 <strong>0</strong>&nbsp;开始的字符串&nbsp;<code>word</code>&nbsp;,字符串只包含小写英文字母。你需要选择 <strong>一个</strong>&nbsp;下标并 <strong>删除</strong>&nbsp;下标处的字符,使得 <code>word</code>&nbsp;中剩余每个字母出现 <strong>频率</strong>&nbsp;相同。</p>
<p>如果删除一个字母后,<code>word</code>&nbsp;中剩余所有字母的出现频率都相同,那么返回 <code>true</code>&nbsp;,否则返回 <code>false</code>&nbsp;</p>
<p><strong>注意:</strong></p>
<ul>
<li>字母&nbsp;<code>x</code>&nbsp;<strong>频率</strong><strong>&nbsp;</strong>是这个字母在字符串中出现的次数。</li>
<li><strong>必须</strong>&nbsp;恰好删除一个字母,不能一个字母都不删除。</li>
</ul>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><b>输入:</b>word = "abcc"
<b>输出:</b>true
<b>解释:</b>选择下标 3 并删除该字母word 变成 "abc" 且每个字母出现频率都为 1 。
</pre>
<p><strong>示例 2</strong></p>
<pre><b>输入:</b>word = "aazz"
<b>输出:</b>false
<b>解释:</b>我们必须删除一个字母,所以要么 "a" 的频率变为 1 且 "z" 的频率为 2 ,要么两个字母频率反过来。所以不可能让剩余所有字母出现频率相同。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>2 &lt;= word.length &lt;= 100</code></li>
<li><code>word</code>&nbsp;只包含小写英文字母。</li>
</ul>

View File

@@ -0,0 +1,54 @@
<p>给你一个仅由小写英文字母组成的字符串 <code>s</code> 。在一步操作中,你可以:</p>
<ul>
<li>删除 <strong>整个字符串</strong> <code>s</code> ,或者</li>
<li>对于满足&nbsp;<code>1 &lt;= i &lt;= s.length / 2</code> 的任意 <code>i</code> ,如果 <code>s</code> 中的 <strong></strong> <code>i</code> 个字母和接下来的 <code>i</code> 个字母 <strong>相等</strong> ,删除 <strong></strong> <code>i</code> 个字母。</li>
</ul>
<p>例如,如果 <code>s = "ababc"</code> ,那么在一步操作中,你可以删除 <code>s</code> 的前两个字母得到 <code>"abc"</code> ,因为 <code>s</code> 的前两个字母和接下来的两个字母都等于 <code>"ab"</code></p>
<p>返回删除 <code>s</code> 所需的最大操作数。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>s = "abcabcdabc"
<strong>输出:</strong>2
<strong>解释:</strong>
- 删除前 3 个字母("abc"),因为它们和接下来 3 个字母相等。现在s = "abcdabc"。
- 删除全部字母。
一共用了 2 步操作,所以返回 2 。可以证明 2 是所需的最大操作数。
注意,在第二步操作中无法再次删除 "abc" ,因为 "abc" 的下一次出现并不是位于接下来的 3 个字母。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>s = "aaabaab"
<strong>输出:</strong>4
<strong>解释:</strong>
- 删除第一个字母("a"因为它和接下来的字母相等。现在s = "aabaab"。
- 删除前 3 个字母("aab"),因为它们和接下来 3 个字母相等。现在s = "aab"。
- 删除第一个字母("a"因为它和接下来的字母相等。现在s = "ab"。
- 删除全部字母。
一共用了 4 步操作,所以返回 4 。可以证明 4 是所需的最大操作数。
</pre>
<p><strong>示例 3</strong></p>
<pre>
<strong>输入:</strong>s = "aaaaa"
<strong>输出:</strong>5
<strong>解释:</strong>在每一步操作中,都可以仅删除 s 的第一个字母。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= s.length &lt;= 4000</code></li>
<li><code>s</code> 仅由小写英文字母组成</li>
</ul>

View File

@@ -0,0 +1,33 @@
<p>给你两个下标从 <strong>0</strong>&nbsp;开始的数组&nbsp;<code>nums1</code>&nbsp;<code>nums2</code>&nbsp;,两个数组都只包含非负整数。请你求出另外一个数组&nbsp;<code>nums3</code>&nbsp;,包含 <code>nums1</code>&nbsp;<code>nums2</code>&nbsp;<strong>所有数对</strong>&nbsp;的异或和(<code>nums1</code>&nbsp;中每个整数都跟 <code>nums2</code>&nbsp;中每个整数 <strong>恰好</strong>&nbsp;匹配一次)。</p>
<p>请你返回 <code>nums3</code>&nbsp;中所有整数的 <strong>异或和</strong>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><b>输入:</b>nums1 = [2,1,3], nums2 = [10,2,5,0]
<b>输出:</b>13
<strong>解释:</strong>
一个可能的 nums3 数组是 [8,0,7,2,11,3,4,1,9,1,6,3] 。
所有这些数字的异或和是 13 ,所以我们返回 13 。
</pre>
<p><strong>示例 2</strong></p>
<pre><b>输入:</b>nums1 = [1,2], nums2 = [3,4]
<b>输出:</b>0
<strong>解释:</strong>
所有数对异或和的结果分别为 nums1[0] ^ nums2[0] nums1[0] ^ nums2[1] nums1[1] ^ nums2[0] 和 nums1[1] ^ nums2[1] 。
所以,一个可能的 nums3 数组是 [2,5,1,6] 。
2 ^ 5 ^ 1 ^ 6 = 0 ,所以我们返回 0 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= nums1.length, nums2.length &lt;= 10<sup>5</sup></code></li>
<li><code>0 &lt;= nums1[i], nums2[j] &lt;= 10<sup>9</sup></code></li>
</ul>

View File

@@ -0,0 +1,40 @@
<p>给你两个正整数 <code>num1</code><code>num2</code> ,找出满足下述条件的整数 <code>x</code> </p>
<ul>
<li><code>x</code> 的置位数和 <code>num2</code> 相同,且</li>
<li><code>x XOR num1</code> 的值 <strong>最小</strong></li>
</ul>
<p>注意 <code>XOR</code> 是按位异或运算。</p>
<p>返回整数<em> </em><code>x</code> 。题目保证,对于生成的测试用例, <code>x</code><strong>唯一确定</strong> 的。</p>
<p>整数的 <strong>置位数</strong> 是其二进制表示中 <code>1</code> 的数目。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><strong>输入:</strong>num1 = 3, num2 = 5
<strong>输出:</strong>3
<strong>解释:</strong>
num1 和 num2 的二进制表示分别是 0011 和 0101 。
整数 <strong>3</strong> 的置位数与 num2 相同,且 <code>3 XOR 3 = 0</code> 是最小的。
</pre>
<p><strong>示例 2</strong></p>
<pre><strong>输入:</strong>num1 = 1, num2 = 12
<strong>输出:</strong>3
<strong>解释:</strong>
num1 和 num2 的二进制表示分别是 0001 和 1100 。
整数 <strong>3</strong> 的置位数与 num2 相同,且 <code>3 XOR 1 = 2</code> 是最小的。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= num1, num2 &lt;= 10<sup>9</sup></code></li>
</ul>

View File

@@ -0,0 +1,27 @@
力扣嘉年华将举办一系列展览活动,后勤部将负责为每场展览提供所需要的展台。
已知后勤部得到了一份需求清单,记录了近期展览所需要的展台类型, `demand[i][j]` 表示第 `i` 天展览时第 `j` 个展台的类型。
在满足每一天展台需求的基础上,请返回后勤部需要准备的 **最小** 展台数量。
**注意:**
- 同一展台在不同天中可以重复使用。
**示例 1**
>输入:`demand = ["acd","bed","accd"]`
>
>输出:`6`
>
>解释:
>第 `0` 天需要展台 `a、c、d`

View File

@@ -0,0 +1,43 @@
<p>给你一个&nbsp;<code>n</code>&nbsp;个视频的上传序列,每个视频编号为&nbsp;<code>1</code>&nbsp;&nbsp;<code>n</code>&nbsp;之间的 <strong>不同</strong>&nbsp;数字,你需要依次将这些视频上传到服务器。请你实现一个数据结构,在上传的过程中计算 <strong>最长上传前缀</strong>&nbsp;</p>
<p>如果&nbsp;<strong>闭区间</strong>&nbsp;<code>1</code>&nbsp;&nbsp;<code>i</code>&nbsp;之间的视频全部都已经被上传到服务器,那么我们称 <code>i</code>&nbsp;是上传前缀。最长上传前缀指的是符合定义的 <code>i</code>&nbsp;中的 <strong>最大值</strong>&nbsp;<br>
<br>
请你实现&nbsp;<code>LUPrefix</code>&nbsp;类:</p>
<ul>
<li><code>LUPrefix(int n)</code>&nbsp;初始化一个 <code>n</code>&nbsp;个视频的流对象。</li>
<li><code>void upload(int video)</code>&nbsp;上传&nbsp;<code>video</code>&nbsp;到服务器。</li>
<li><code>int longest()</code>&nbsp;返回上述定义的 <strong>最长上传前缀</strong>&nbsp;的长度。</li>
</ul>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><strong>输入:</strong>
["LUPrefix", "upload", "longest", "upload", "longest", "upload", "longest"]
[[4], [3], [], [1], [], [2], []]
<strong>输出:</strong>
[null, null, 0, null, 1, null, 3]
<strong>解释:</strong>
LUPrefix server = new LUPrefix(4); // 初始化 4个视频的上传流
server.upload(3); // 上传视频 3 。
server.longest(); // 由于视频 1 还没有被上传,最长上传前缀是 0 。
server.upload(1); // 上传视频 1 。
server.longest(); // 前缀 [1] 是最长上传前缀,所以我们返回 1 。
server.upload(2); // 上传视频 2 。
server.longest(); // 前缀 [1,2,3] 是最长上传前缀,所以我们返回 3 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= n &lt;= 10<sup>5</sup></code></li>
<li><code>1 &lt;= video &lt;= 10<sup>5</sup></code></li>
<li><code>video</code>&nbsp;中所有值 <strong>互不相同</strong>&nbsp;</li>
<li><code>upload</code>&nbsp;<code>longest</code>&nbsp;<strong>总调用</strong> 次数至多不超过&nbsp;<code>2 * 10<sup>5</sup></code>&nbsp;次。</li>
<li>至少会调用&nbsp;<code>longest</code>&nbsp;一次。</li>
</ul>

View File

@@ -0,0 +1,34 @@
在力扣城的沙漠分会场展示了一种沙柳树,这种沙柳树能够将沙地转化为坚实的绿地。
展示的区域为正三角形,这片区域可以拆分为若干个子区域,每个子区域都是边长为 `1` 的小三角形,其中第 `i` 行有 `2i - 1` 个小三角形。
初始情况下,区域中的所有位置都为沙地,你需要指定一些子区域种植沙柳树成为绿地,以达到转化整片区域为绿地的最终目的,规则如下:
- 若两个子区域共用一条边,则视为相邻;
>如下图所示,(1,1)和(2,2)相邻,(3,2)和(3,3)相邻;(2,2)和(3,3)不相邻,因为它们没有共用边。
- 若至少有两片绿地与同一片沙地相邻,则这片沙地也会转化为绿地
- 转化为绿地的区域会影响其相邻的沙地
![image.png](https://pic.leetcode-cn.com/1662692397-VlvErS-image.png)
现要将一片边长为 `size` 的沙地全部转化为绿地,请找到任意一种初始指定 **最少** 数量子区域种植沙柳的方案,并返回所有初始种植沙柳树的绿地坐标。
**示例 1**
>输入:`size = 3`
>输出:`[[1,1],[2,1],[2,3],[3,1],[3,5]]`
>解释:如下图所示,一种方案为:
>指定所示的 5 个子区域为绿地。

View File

@@ -0,0 +1,34 @@
<p>给你一个大小为 <code>m x n</code> 的整数矩阵 <code>grid</code></p>
<p>按以下形式将矩阵的一部分定义为一个 <strong>沙漏</strong> </p>
<img alt="" src="https://assets.leetcode.com/uploads/2022/08/21/img.jpg" style="width: 243px; height: 243px;">
<p>返回沙漏中元素的 <strong>最大</strong> 总和。</p>
<p><strong>注意:</strong>沙漏无法旋转且必须整个包含在矩阵中。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2022/08/21/1.jpg" style="width: 323px; height: 323px;">
<pre><strong>输入:</strong>grid = [[6,2,1,3],[4,2,1,5],[9,2,8,7],[4,1,2,9]]
<strong>输出:</strong>30
<strong>解释:</strong>上图中的单元格表示元素总和最大的沙漏6 + 2 + 1 + 2 + 9 + 2 + 8 = 30 。
</pre>
<p><strong>示例 2</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2022/08/21/2.jpg" style="width: 243px; height: 243px;">
<pre><strong>输入:</strong>grid = [[1,2,3],[4,5,6],[7,8,9]]
<strong>输出:</strong>35
<strong>解释:</strong>上图中的单元格表示元素总和最大的沙漏1 + 2 + 3 + 5 + 7 + 8 + 9 = 35 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>m == grid.length</code></li>
<li><code>n == grid[i].length</code></li>
<li><code>3 &lt;= m, n &lt;= 150</code></li>
<li><code>0 &lt;= grid[i][j] &lt;= 10<sup>6</sup></code></li>
</ul>

View File

@@ -0,0 +1,41 @@
<p>给你两个下标从 <strong>0</strong>&nbsp;开始的整数数组&nbsp;<code>nums1</code>&nbsp;<code>nums2</code>&nbsp;,两个数组的大小都为&nbsp;<code>n</code>&nbsp;,同时给你一个整数&nbsp;<code>diff</code>&nbsp;,统计满足以下条件的&nbsp;<strong>数对&nbsp;</strong><code>(i, j)</code>&nbsp;</p>
<ul>
<li><code>0 &lt;= i &lt; j &lt;= n - 1</code>&nbsp;<b></b></li>
<li><code>nums1[i] - nums1[j] &lt;= nums2[i] - nums2[j] + diff</code>.</li>
</ul>
<p>请你返回满足条件的 <strong>数对数目</strong>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><b>输入:</b>nums1 = [3,2,5], nums2 = [2,2,1], diff = 1
<b>输出:</b>3
<strong>解释:</strong>
总共有 3 个满足条件的数对:
1. i = 0, j = 13 - 2 &lt;= 2 - 2 + 1 。因为 i &lt; j 且 1 &lt;= 1 ,这个数对满足条件。
2. i = 0, j = 23 - 5 &lt;= 2 - 1 + 1 。因为 i &lt; j 且 -2 &lt;= 2 ,这个数对满足条件。
3. i = 1, j = 22 - 5 &lt;= 2 - 1 + 1 。因为 i &lt; j 且 -3 &lt;= 2 ,这个数对满足条件。
所以,我们返回 3 。
</pre>
<p><strong>示例 2</strong></p>
<pre><b>输入:</b>nums1 = [3,-1], nums2 = [-2,2], diff = -1
<b>输出:</b>0
<strong>解释:</strong>
没有满足条件的任何数对,所以我们返回 0 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>n == nums1.length == nums2.length</code></li>
<li><code>2 &lt;= n &lt;= 10<sup>5</sup></code></li>
<li><code>-10<sup>4</sup> &lt;= nums1[i], nums2[i] &lt;= 10<sup>4</sup></code></li>
<li><code>-10<sup>4</sup> &lt;= diff &lt;= 10<sup>4</sup></code></li>
</ul>

View File

@@ -0,0 +1,30 @@
力扣嘉年华的花店中从左至右摆放了一排鲜花,记录于整型一维矩阵 `flowers` 中每个数字表示该位置所种鲜花的品种编号。你可以选择一段区间的鲜花做成插花,且不能丢弃。
在你选择的插花中,如果每一品种的鲜花数量都不超过 `cnt` 朵,那么我们认为这束插花是 「美观的」。
> - 例如:`[5,5,5,6,6]` 中品种为 `5` 的花有 `3` 朵, 品种为 `6` 的花有 `2` 朵,**每一品种** 的数量均不超过 `3`
请返回在这一排鲜花中,共有多少种可选择的区间,使得插花是「美观的」。
**注意:**
- 答案需要以 `1e9 + 7 (1000000007)` 为底取模,如:计算初始结果为:`1000000008`,请返回 `1`
**示例 1**
>输入:`flowers = [1,2,3,2], cnt = 1`
>
>输出:`8`
>
>解释:相同的鲜花不超过 `1` 朵,共有 `8` 种花束是美观的;

View File

@@ -0,0 +1,29 @@
力扣嘉年华上的 DIY 手工展位准备了一棵缩小版的 **二叉** 装饰树 `root` 和灯饰,你需要将灯饰逐一插入装饰树中,要求如下:
- 完成装饰的二叉树根结点与 `root` 的根结点值相同
- 若一个节点拥有父节点,则在该节点和他的父节点之间插入一个灯饰(即插入一个值为 `-1` 的节点)。具体地:
- 在一个 父节点 x 与其左子节点 y 之间添加 -1 节点, 节点 -1、节点 y 为各自父节点的左子节点,
- 在一个 父节点 x 与其右子节点 y 之间添加 -1 节点, 节点 -1、节点 y 为各自父节点的右子节点,
现给定二叉树的根节点 `root` ,请返回完成装饰后的树的根节点。
**示例 1**
>输入:
>`root = [7,5,6]`
>
>输出:`[7,-1,-1,5,null,null,6]`
>
>解释:如下图所示,

View File

@@ -0,0 +1,56 @@
字符串数组 `shape` 描述了一个二维平面中的矩阵形式的集水器,`shape[i][j]` 表示集水器的第 `i``j` 列为:
- `'l'`表示向左倾斜的隔板(即从左上到右下);
- `'r'`表示向右倾斜的隔板(即从左下到右上);
- `'.'` 表示此位置没有隔板
![image.png](https://pic.leetcode-cn.com/1664424667-wMnPja-image.png){:width=200px}
已知当隔板构成存储容器可以存水,每个方格代表的蓄水量为 `2`。集水器初始浸泡在水中,除内部密闭空间外,所有位置均被水填满。
现将其从水中竖直向上取出,请返回集水器最终的蓄水量。
**注意:**
- 隔板具有良好的透气性,因此空气可以穿过隔板,但水无法穿过
**示例 1**
> 输入:
> `shape = ["....rl","l.lr.r",".l..r.","..lr.."]`
>
> 输出:`18`
>
> 解释:如下图所示,由于空气会穿过隔板,因此红框区域没有水
![image.png](https://pic.leetcode-cn.com/1664436239-eyYxeP-image.png){:width="280px"}
**示例 2**
> 输入:
> `shape = [".rlrlrlrl","ll..rl..r",".llrrllrr","..lr..lr."]`
> 输出:`18`
>
> 解释:如图所示。由于红框右侧未闭合,因此多余的水会从该处流走。