1
0
mirror of https://gitee.com/coder-xiaomo/leetcode-problemset synced 2025-10-19 20:16:48 +08:00
Code Issues Projects Releases Wiki Activity GitHub Gitee
This commit is contained in:
2022-07-29 23:59:06 +08:00
parent e6b8964ee2
commit 321b55e52f
47 changed files with 115621 additions and 110980 deletions

View File

@@ -0,0 +1,48 @@
<p>给你一个长度为 <code>n</code>&nbsp;的整数数组&nbsp;<code>rolls</code>&nbsp;和一个整数&nbsp;<code>k</code>&nbsp;。你扔一个&nbsp;<code>k</code>&nbsp;面的骰子 <code>n</code>&nbsp;次,骰子的每个面分别是&nbsp;<code>1</code>&nbsp;&nbsp;<code>k</code>&nbsp;,其中第&nbsp;<code>i</code>&nbsp;次扔得到的数字是&nbsp;<code>rolls[i]</code>&nbsp;</p>
<p>请你返回 <strong>无法</strong>&nbsp;<code>rolls</code>&nbsp;中得到的 <strong>最短</strong>&nbsp;骰子子序列的长度。</p>
<p>扔一个 <code>k</code>&nbsp;面的骰子 <code>len</code>&nbsp;次得到的是一个长度为 <code>len</code>&nbsp;<strong>骰子子序列</strong>&nbsp;</p>
<p><strong>注意</strong>&nbsp;,子序列只需要保持在原数组中的顺序,不需要连续。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<b>输入:</b>rolls = [4,2,1,2,3,3,2,4,1], k = 4
<b>输出:</b>3
<b>解释:</b>所有长度为 1 的骰子子序列 [1] [2] [3] [4] 都可以从原数组中得到。
所有长度为 2 的骰子子序列 [1, 1] [1, 2] ... [4, 4] 都可以从原数组中得到。
子序列 [1, 4, 2] 无法从原数组中得到,所以我们返回 3 。
还有别的子序列也无法从原数组中得到。</pre>
<p><strong>示例 2</strong></p>
<pre>
<b>输入:</b>rolls = [1,1,2,2], k = 2
<b>输出:</b>2
<b>解释:</b>所有长度为 1 的子序列 [1] [2] 都可以从原数组中得到。
子序列 [2, 1] 无法从原数组中得到,所以我们返回 2 。
还有别的子序列也无法从原数组中得到,但 [2, 1] 是最短的子序列。
</pre>
<p><strong>示例 3</strong></p>
<pre>
<b>输入:</b>rolls = [1,1,3,2,2,2,3,3], k = 4
<b>输出:</b>1
<b>解释:</b>子序列 [4] 无法从原数组中得到,所以我们返回 1 。
还有别的子序列也无法从原数组中得到,但 [4] 是最短的子序列。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>n == rolls.length</code></li>
<li><code>1 &lt;= n &lt;= 10<sup>5</sup></code></li>
<li><code>1 &lt;= rolls[i] &lt;= k &lt;= 10<sup>5</sup></code></li>
</ul>

View File

@@ -0,0 +1,45 @@
<p>给你一个下标从 <strong>0</strong> 开始的正整数数组 <code>nums</code> 和一个正整数 <code>k</code></p>
<p>如果满足下述条件,则数对 <code>(num1, num2)</code><strong>优质数对</strong> </p>
<ul>
<li><code>num1</code><code>num2</code> <strong></strong> 在数组 <code>nums</code> 中存在。</li>
<li><code>num1 OR num2</code><code>num1 AND num2</code> 的二进制表示中值为 <strong>1</strong> 的位数之和大于等于 <code>k</code> ,其中 <code>OR</code> 是按位 <strong></strong> 操作,而 <code>AND</code> 是按位 <strong></strong> 操作。</li>
</ul>
<p>返回 <strong>不同</strong> 优质数对的数目。</p>
<p>如果&nbsp;<code>a != c</code> 或者 <code>b != d</code> ,则认为 <code>(a, b)</code><code>(c, d)</code> 是不同的两个数对。例如,<code>(1, 2)</code><code>(2, 1)</code> 不同。</p>
<p><strong>注意:</strong>如果 <code>num1</code> 在数组中至少出现 <strong>一次</strong> ,则满足 <code>num1 == num2</code> 的数对 <code>(num1, num2)</code> 也可以是优质数对。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>nums = [1,2,3,1], k = 3
<strong>输出:</strong>5
<strong>解释:</strong>有如下几个优质数对:
- (3, 3)(3 AND 3) 和 (3 OR 3) 的二进制表示都等于 (11) 。值为 1 的位数和等于 2 + 2 = 4 ,大于等于 k = 3 。
- (2, 3) 和 (3, 2) (2 AND 3) 的二进制表示等于 (10) (2 OR 3) 的二进制表示等于 (11) 。值为 1 的位数和等于 1 + 2 = 3 。
- (1, 3) 和 (3, 1) (1 AND 3) 的二进制表示等于 (01) (1 OR 3) 的二进制表示等于 (11) 。值为 1 的位数和等于 1 + 2 = 3 。
所以优质数对的数目是 5 。</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>nums = [5,1,1], k = 10
<strong>输出:</strong>0
<strong>解释:</strong>该数组中不存在优质数对。
</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;= k &lt;= 60</code></li>
</ul>

View File

@@ -0,0 +1,41 @@
<p>给你一个整数数组&nbsp;<code>nums</code>&nbsp;,返回全部为&nbsp;<code>0</code>&nbsp;&nbsp;<strong>子数组</strong>&nbsp;数目。</p>
<p><strong>子数组</strong>&nbsp;是一个数组中一段连续非空元素组成的序列。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><b>输入:</b>nums = [1,3,0,0,2,0,0,4]
<b>输出:</b>6
<b>解释:</b>
子数组 [0] 出现了 4 次。
子数组 [0,0] 出现了 2 次。
不存在长度大于 2 的全 0 子数组,所以我们返回 6 。</pre>
<p><strong>示例 2</strong></p>
<pre><b>输入:</b>nums = [0,0,0,2,0,0]
<b>输出:</b>9
<strong>解释:
</strong>子数组 [0] 出现了 5 次。
子数组 [0,0] 出现了 3 次。
子数组 [0,0,0] 出现了 1 次。
不存在长度大于 3 的全 0 子数组,所以我们返回 9 。
</pre>
<p><strong>示例 3</strong></p>
<pre><b>输入:</b>nums = [2,10,2019]
<b>输出:</b>0
<b>解释:</b>没有全 0 子数组,所以我们返回 0 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= nums.length &lt;= 10<sup>5</sup></code></li>
<li><code>-10<sup>9</sup> &lt;= nums[i] &lt;= 10<sup>9</sup></code></li>
</ul>

View File

@@ -0,0 +1,50 @@
<p>给你一个整数数组&nbsp;<code>ranks</code>&nbsp;和一个字符数组&nbsp;<code>suit</code>&nbsp;。你有&nbsp;<code>5</code>&nbsp;张扑克牌,第&nbsp;<code>i</code>&nbsp;张牌大小为&nbsp;<code>ranks[i]</code>&nbsp;,花色为&nbsp;<code>suits[i]</code>&nbsp;</p>
<p>下述是从好到坏你可能持有的 <strong>手牌类型&nbsp;</strong></p>
<ol>
<li><code>"Flush"</code>:同花,五张相同花色的扑克牌。</li>
<li><code>"Three of a Kind"</code>:三条,有 3 张大小相同的扑克牌。</li>
<li><code>"Pair"</code>:对子,两张大小一样的扑克牌。</li>
<li><code>"High Card"</code>:高牌,五张大小互不相同的扑克牌。</li>
</ol>
<p>请你返回一个字符串,表示给定的 5 张牌中,你能组成的 <strong>最好手牌类型</strong>&nbsp;</p>
<p><strong>注意:</strong>返回的字符串&nbsp;<strong>大小写</strong>&nbsp;需与题目描述相同。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><b>输入:</b>ranks = [13,2,3,1,9], suits = ["a","a","a","a","a"]
<b>输出:</b>"Flush"
<b>解释:</b>5 张扑克牌的花色相同,所以返回 "Flush" 。
</pre>
<p><strong>示例 2</strong></p>
<pre><b>输入:</b>ranks = [4,4,2,4,4], suits = ["d","a","a","b","c"]
<b>输出:</b>"Three of a Kind"
<b>解释:</b>第一、二和四张牌组成三张相同大小的扑克牌,所以得到 "Three of a Kind" 。
注意我们也可以得到 "Pair" ,但是 "Three of a Kind" 是更好的手牌类型。
有其他的 3 张牌也可以组成 "Three of a Kind" 手牌类型。</pre>
<p><strong>示例 3</strong></p>
<pre><b>输入:</b>ranks = [10,10,2,12,9], suits = ["a","b","c","a","d"]
<b>输出:</b>"Pair"
<b>解释:</b>第一和第二张牌大小相同,所以得到 "Pair" 。
我们无法得到 "Flush" 或者 "Three of a Kind" 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>ranks.length == suits.length == 5</code></li>
<li><code>1 &lt;= ranks[i] &lt;= 13</code></li>
<li><code>'a' &lt;= suits[i] &lt;= 'd'</code></li>
<li>任意两张扑克牌不会同时有相同的大小和花色。</li>
</ul>

View File

@@ -0,0 +1,39 @@
<p>给你一个下标从 <strong>0</strong> 开始、大小为 <code>n x n</code> 的整数矩阵 <code>grid</code> ,返回满足 <code>R<sub>i</sub></code><em> </em>行和<em> </em><code>C<sub>j</sub></code><em> </em>列相等的行列对<em> </em><code>(R<sub>i</sub>, C<sub>j</sub>)</code><em> </em>的数目<em></em></p>
<p>如果行和列以相同的顺序包含相同的元素(即相等的数组),则认为二者是相等的。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<p><img alt="" src="https://assets.leetcode.com/uploads/2022/06/01/ex1.jpg" style="width: 150px; height: 153px;" /></p>
<pre>
<strong>输入:</strong>grid = [[3,2,1],[1,7,6],[2,7,7]]
<strong>输出:</strong>1
<strong>解释:</strong>存在一对相等行列对:
- (第 2 行,第 1 列)[2,7,7]
</pre>
<p><strong>示例 2</strong></p>
<p><img alt="" src="https://assets.leetcode.com/uploads/2022/06/01/ex2.jpg" style="width: 200px; height: 209px;" /></p>
<pre>
<strong>输入:</strong>grid = [[3,1,2,2],[1,4,4,5],[2,4,2,2],[2,4,2,2]]
<strong>输出:</strong>3
<strong>解释:</strong>存在三对相等行列对:
- (第 0 行,第 0 列)[3,1,2,2]
- (第 2 行, 第 2 列)[2,4,2,2]
- (第 3 行, 第 2 列)[2,4,2,2]
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>n == grid.length == grid[i].length</code></li>
<li><code>1 &lt;= n &lt;= 200</code></li>
<li><code>1 &lt;= grid[i][j] &lt;= 10<sup>5</sup></code></li>
</ul>

View File

@@ -0,0 +1,40 @@
<p>给你一个由小写英文字母组成的字符串 <code>s</code> ,请你找出并返回第一个出现 <strong>两次</strong> 的字母。</p>
<p><strong>注意:</strong></p>
<ul>
<li>如果 <code>a</code><strong>第二次</strong> 出现比 <code>b</code><strong>第二次</strong> 出现在字符串中的位置更靠前,则认为字母 <code>a</code> 在字母 <code>b</code> 之前出现两次。</li>
<li><code>s</code> 包含至少一个出现两次的字母。</li>
</ul>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><strong>输入:</strong>s = "abccbaacz"
<strong>输出:</strong>"c"
<strong>解释:</strong>
字母 'a' 在下标 0 、5 和 6 处出现。
字母 'b' 在下标 1 和 4 处出现。
字母 'c' 在下标 2 、3 和 7 处出现。
字母 'z' 在下标 8 处出现。
字母 'c' 是第一个出现两次的字母,因为在所有字母中,'c' 第二次出现的下标是最小的。
</pre>
<p><strong>示例 2</strong></p>
<pre><strong>输入:</strong>s = "abcdd"
<strong>输出:</strong>"d"
<strong>解释:</strong>
只有字母 'd' 出现两次,所以返回 'd' 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>2 &lt;= s.length &lt;= 100</code></li>
<li><code>s</code> 由小写英文字母组成</li>
<li><code>s</code> 包含至少一个重复字母</li>
</ul>

View File

@@ -0,0 +1,46 @@
<p>设计一个数字容器系统,可以实现以下功能:</p>
<ul>
<li>在系统中给定下标处&nbsp;<strong>插入</strong>&nbsp;或者 <strong>替换</strong>&nbsp;一个数字。</li>
<li><strong>返回</strong>&nbsp;系统中给定数字的最小下标。</li>
</ul>
<p>请你实现一个&nbsp;<code>NumberContainers</code>&nbsp;类:</p>
<ul>
<li><code>NumberContainers()</code>&nbsp;初始化数字容器系统。</li>
<li><code>void change(int index, int number)</code> 在下标&nbsp;<code>index</code>&nbsp;处填入&nbsp;<code>number</code>&nbsp;。如果该下标&nbsp;<code>index</code>&nbsp;处已经有数字了,那么用 <code>number</code>&nbsp;替换该数字。</li>
<li><code>int find(int number)</code>&nbsp;返回给定数字&nbsp;<code>number</code>&nbsp;在系统中的最小下标。如果系统中没有&nbsp;<code>number</code>&nbsp;,那么返回&nbsp;<code>-1</code>&nbsp;</li>
</ul>
<p>&nbsp;</p>
<p><strong>示例:</strong></p>
<pre>
<strong>输入:</strong>
["NumberContainers", "find", "change", "change", "change", "change", "find", "change", "find"]
[[], [10], [2, 10], [1, 10], [3, 10], [5, 10], [10], [1, 20], [10]]
<strong>输出:</strong>
[null, -1, null, null, null, null, 1, null, 2]
<strong>解释:</strong>
NumberContainers nc = new NumberContainers();
nc.find(10); // 没有数字 10 ,所以返回 -1 。
nc.change(2, 10); // 容器中下标为 2 处填入数字 10 。
nc.change(1, 10); // 容器中下标为 1 处填入数字 10 。
nc.change(3, 10); // 容器中下标为 3 处填入数字 10 。
nc.change(5, 10); // 容器中下标为 5 处填入数字 10 。
nc.find(10); // 数字 10 所在的下标为 1 2 3 和 5 。因为最小下标为 1 ,所以返回 1 。
nc.change(1, 20); // 容器中下标为 1 处填入数字 20 。注意,下标 1 处之前为 10 ,现在被替换为 20 。
nc.find(10); // 数字 10 所在下标为 2 3 和 5 。最小下标为 2 ,所以返回 2 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= index, number &lt;= 10<sup>9</sup></code></li>
<li>调用&nbsp;<code>change</code>&nbsp;<code>find</code>&nbsp;&nbsp;<strong>总次数</strong>&nbsp;不超过&nbsp;<code>10<sup>5</sup></code> 次。</li>
</ul>

View File

@@ -0,0 +1,64 @@
<p>设计一个支持下述操作的食物评分系统:</p>
<ul>
<li><strong>修改</strong> 系统中列出的某种食物的评分。</li>
<li>返回系统中某一类烹饪方式下评分最高的食物。</li>
</ul>
<p>实现 <code>FoodRatings</code> 类:</p>
<ul>
<li><code>FoodRatings(String[] foods, String[] cuisines, int[] ratings)</code> 初始化系统。食物由 <code>foods</code><code>cuisines</code><code>ratings</code> 描述,长度均为 <code>n</code>
<ul>
<li><code>foods[i]</code> 是第 <code>i</code> 种食物的名字。</li>
<li><code>cuisines[i]</code> 是第 <code>i</code> 种食物的烹饪方式。</li>
<li><code>ratings[i]</code> 是第 <code>i</code> 种食物的最初评分。</li>
</ul>
</li>
<li><code>void changeRating(String food, int newRating)</code> 修改名字为 <code>food</code> 的食物的评分。</li>
<li><code>String highestRated(String cuisine)</code> 返回指定烹饪方式 <code>cuisine</code> 下评分最高的食物的名字。如果存在并列,返回 <strong>字典序较小</strong> 的名字。</li>
</ul>
<p>注意,字符串 <code>x</code> 的字典序比字符串 <code>y</code> 更小的前提是:<code>x</code> 在字典中出现的位置在 <code>y</code> 之前,也就是说,要么 <code>x</code><code>y</code> 的前缀,或者在满足&nbsp;<code>x[i] != y[i]</code> 的第一个位置 <code>i</code> 处,<code>x[i]</code> 在字母表中出现的位置在 <code>y[i]</code> 之前。</p>
<p>&nbsp;</p>
<p><strong>示例:</strong></p>
<pre><strong>输入</strong>
["FoodRatings", "highestRated", "highestRated", "changeRating", "highestRated", "changeRating", "highestRated"]
[[["kimchi", "miso", "sushi", "moussaka", "ramen", "bulgogi"], ["korean", "japanese", "japanese", "greek", "japanese", "korean"], [9, 12, 8, 15, 14, 7]], ["korean"], ["japanese"], ["sushi", 16], ["japanese"], ["ramen", 16], ["japanese"]]
<strong>输出</strong>
[null, "kimchi", "ramen", null, "sushi", null, "ramen"]
<strong>解释</strong>
FoodRatings foodRatings = new FoodRatings(["kimchi", "miso", "sushi", "moussaka", "ramen", "bulgogi"], ["korean", "japanese", "japanese", "greek", "japanese", "korean"], [9, 12, 8, 15, 14, 7]);
foodRatings.highestRated("korean"); // 返回 "kimchi"
// "kimchi" 是分数最高的韩式料理,评分为 9 。
foodRatings.highestRated("japanese"); // 返回 "ramen"
// "ramen" 是分数最高的日式料理,评分为 14 。
foodRatings.changeRating("sushi", 16); // "sushi" 现在评分变更为 16 。
foodRatings.highestRated("japanese"); // 返回 "sushi"
// "sushi" 是分数最高的日式料理,评分为 16 。
foodRatings.changeRating("ramen", 16); // "ramen" 现在评分变更为 16 。
foodRatings.highestRated("japanese"); // 返回 "ramen"
// "sushi" 和 "ramen" 的评分都是 16 。
// 但是,"ramen" 的字典序比 "sushi" 更小。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= n &lt;= 2 * 10<sup>4</sup></code></li>
<li><code>n == foods.length == cuisines.length == ratings.length</code></li>
<li><code>1 &lt;= foods[i].length, cuisines[i].length &lt;= 10</code></li>
<li><code>foods[i]</code><code>cuisines[i]</code> 由小写英文字母组成</li>
<li><code>1 &lt;= ratings[i] &lt;= 10<sup>8</sup></code></li>
<li><code>foods</code> 中的所有字符串 <strong>互不相同</strong></li>
<li>在对&nbsp;<code>changeRating</code> 的所有调用中,<code>food</code> 是系统中食物的名字。</li>
<li>在对&nbsp;<code>highestRated</code> 的所有调用中,<code>cuisine</code> 是系统中 <strong>至少一种</strong> 食物的烹饪方式。</li>
<li>最多调用 <code>changeRating</code><code>highestRated</code> <strong>总计</strong> <code>2 * 10<sup>4</sup></code></li>
</ul>