1
0
mirror of https://gitee.com/coder-xiaomo/leetcode-problemset synced 2025-10-19 12:06:48 +08:00
Code Issues Projects Releases Wiki Activity GitHub Gitee
This commit is contained in:
2022-05-22 11:21:15 +08:00
parent f3b23d1fc3
commit f5bf94d67e
46 changed files with 16014 additions and 11651 deletions

View File

@@ -0,0 +1,37 @@
<p>Alice 管理着一家公司并租用大楼的部分楼层作为办公空间。Alice 决定将一些楼层作为 <strong>特殊楼层</strong> ,仅用于放松。</p>
<p>给你两个整数 <code>bottom</code><code>top</code> ,表示 Alice 租用了从 <code>bottom</code><code>top</code>(含 <code>bottom</code><code>top</code> 在内)的所有楼层。另给你一个整数数组 <code>special</code> ,其中 <code>special[i]</code> 表示&nbsp; Alice 指定用于放松的特殊楼层。</p>
<p>返回不含特殊楼层的 <strong>最大</strong> 连续楼层数。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>bottom = 2, top = 9, special = [4,6]
<strong>输出:</strong>3
<strong>解释:</strong>下面列出的是不含特殊楼层的连续楼层范围:
- (2, 3) ,楼层数为 2 。
- (5, 5) ,楼层数为 1 。
- (7, 9) ,楼层数为 3 。
因此,返回最大连续楼层数 3 。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>bottom = 6, top = 8, special = [7,6,8]
<strong>输出:</strong>0
<strong>解释:</strong>每层楼都被规划为特殊楼层,所以返回 0 。
</pre>
<p>&nbsp;</p>
<p><strong>提示</strong></p>
<ul>
<li><code>1 &lt;= special.length &lt;= 10<sup>5</sup></code></li>
<li><code>1 &lt;= bottom &lt;= special[i] &lt;= top &lt;= 10<sup>9</sup></code></li>
<li><code>special</code> 中的所有值 <strong>互不相同</strong></li>
</ul>

View File

@@ -0,0 +1,44 @@
<p>给你一个下标从 <strong>0</strong>&nbsp;开始长度为 <code>n</code>&nbsp;的整数数组&nbsp;<code>nums</code>&nbsp;<br />
<span style="">如果以下描述为真,那么</span><span style=""> </span><code>nums</code>&nbsp;在下标 <code>i</code>&nbsp;处有一个 <strong>合法的分割</strong>&nbsp;</p>
<ul>
<li>&nbsp;<code>i + 1</code>&nbsp;个元素的和 <strong>大于等于</strong>&nbsp;剩下的&nbsp;<code>n - i - 1</code>&nbsp;个元素的和。</li>
<li>下标 <code>i</code>&nbsp;的右边 <strong>至少有一个</strong>&nbsp;元素,也就是说下标&nbsp;<code>i</code>&nbsp;满足&nbsp;<code>0 &lt;= i &lt; n - 1</code>&nbsp;</li>
</ul>
<p>请你返回&nbsp;<code>nums</code>&nbsp;中的&nbsp;<strong>合法分割</strong>&nbsp;方案数。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<b>输入:</b>nums = [10,4,-8,7]
<b>输出:</b>2
<b>解释:</b>
总共有 3 种不同的方案可以将 nums 分割成两个非空的部分:
- 在下标 0 处分割 nums 。那么第一部分为 [10] ,和为 10 。第二部分为 [4,-8,7] ,和为 3 。因为 10 &gt;= 3 ,所以 i = 0 是一个合法的分割。
- 在下标 1 处分割 nums 。那么第一部分为 [10,4] ,和为 14 。第二部分为 [-8,7] ,和为 -1 。因为 14 &gt;= -1 ,所以 i = 1 是一个合法的分割。
- 在下标 2 处分割 nums 。那么第一部分为 [10,4,-8] ,和为 6 。第二部分为 [7] ,和为 7 。因为 6 &lt; 7 ,所以 i = 2 不是一个合法的分割。
所以 nums 中总共合法分割方案受为 2 。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<b>输入:</b>nums = [2,3,1,0]
<b>输出:</b>2
<b>解释:</b>
总共有 2 种 nums 的合法分割:
- 在下标 1 处分割 nums 。那么第一部分为 [2,3] ,和为 5 。第二部分为 [1,0] ,和为 1 。因为 5 &gt;= 1 ,所以 i = 1 是一个合法的分割。
- 在下标 2 处分割 nums 。那么第一部分为 [2,3,1] ,和为 6 。第二部分为 [0] ,和为 0 。因为 6 &gt;= 0 ,所以 i = 2 是一个合法的分割。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>2 &lt;= nums.length &lt;= 10<sup>5</sup></code></li>
<li><code>-10<sup>5</sup> &lt;= nums[i] &lt;= 10<sup>5</sup></code></li>
</ul>

View File

@@ -0,0 +1,53 @@
<p>一个整数 <code>num</code>&nbsp;&nbsp;<strong>k&nbsp;</strong>美丽值定义为&nbsp;<code>num</code>&nbsp;中符合以下条件的&nbsp;<strong>子字符串</strong>&nbsp;数目:</p>
<ul>
<li>子字符串长度为&nbsp;<code>k</code>&nbsp;</li>
<li>子字符串能整除 <code>num</code></li>
</ul>
<p>给你整数&nbsp;<code>num</code>&nbsp;<code>k</code>&nbsp;,请你返回<em>&nbsp;</em><code>num</code>&nbsp;的 k 美丽值。</p>
<p>注意:</p>
<ul>
<li>允许有&nbsp;<strong>前缀</strong>&nbsp;<strong>0</strong>&nbsp;</li>
<li><code>0</code>&nbsp;不能整除任何值。</li>
</ul>
<p>一个 <strong>子字符串</strong>&nbsp;是一个字符串里的连续一段字符序列。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<b>输入:</b>num = 240, k = 2
<b>输出:</b>2
<b>解释:</b>以下是 num 里长度为 k 的子字符串:
- "<em><strong>24</strong></em>0" 中的 "24" 24 能整除 240 。
- "2<em><strong>40</strong></em>" 中的 "40" 40 能整除 240 。
所以k 美丽值为 2 。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<b>输入:</b>num = 430043, k = 2
<b>输出:</b>2
<b>解释:</b>以下是 num 里长度为 k 的子字符串:
- "<em><strong>43</strong></em>0043" 中的 "43" 43 能整除 430043 。
- "4<em><strong>30</strong></em>043" 中的 "30" 30 不能整除 430043 。
- "43<em><strong>00</strong></em>43" 中的 "00" 0 不能整除 430043 。
- "430<em><strong>04</strong></em>3" 中的 "04" 4 不能整除 430043 。
- "4300<em><strong>43</strong></em>" 中的 "43" 43 能整除 430043 。
所以k 美丽值为 2 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= num &lt;= 10<sup>9</sup></code></li>
<li><code>1 &lt;= k &lt;= num.length</code>&nbsp;(将&nbsp;<code>num</code>&nbsp;视为字符串)</li>
</ul>

View File

@@ -0,0 +1,42 @@
<p>对数组&nbsp;<code>nums</code> 执行 <strong>按位与</strong> 相当于对数组&nbsp;<code>nums</code> 中的所有整数执行 <strong>按位与</strong></p>
<ul>
<li>例如,对 <code>nums = [1, 5, 3]</code> 来说,按位与等于 <code>1 &amp; 5 &amp; 3 = 1</code></li>
<li>同样,对 <code>nums = [7]</code> 而言,按位与等于 <code>7</code></li>
</ul>
<p>给你一个正整数数组 <code>candidates</code> 。计算 <code>candidates</code> 中的数字每种组合下 <strong>按位与</strong> 的结果。 <code>candidates</code> 中的每个数字在每种组合中只能使用 <strong>一次</strong></p>
<p>返回按位与结果大于 <code>0</code><strong>最长</strong> 组合的长度<em></em></p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>candidates = [16,17,71,62,12,24,14]
<strong>输出:</strong>4
<strong>解释:</strong>组合 [16,17,62,24] 的按位与结果是 16 &amp; 17 &amp; 62 &amp; 24 = 16 &gt; 0 。
组合长度是 4 。
可以证明不存在按位与结果大于 0 且长度大于 4 的组合。
注意,符合长度最大的组合可能不止一种。
例如,组合 [62,12,24,14] 的按位与结果是 62 &amp; 12 &amp; 24 &amp; 14 = 8 &gt; 0 。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>candidates = [8,8]
<strong>输出:</strong>2
<strong>解释:</strong>最长组合是 [8,8] ,按位与结果 8 &amp; 8 = 8 &gt; 0 。
组合长度是 2 ,所以返回 2 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= candidates.length &lt;= 10<sup>5</sup></code></li>
<li><code>1 &lt;= candidates[i] &lt;= 10<sup>7</sup></code></li>
</ul>

View File

@@ -0,0 +1,39 @@
<p>字符串的 <strong>波动</strong>&nbsp;定义为子字符串中出现次数 <strong>最多</strong>&nbsp;的字符次数与出现次数 <strong>最少</strong>&nbsp;的字符次数之差。</p>
<p>给你一个字符串&nbsp;<code>s</code>&nbsp;,它只包含小写英文字母。请你返回 <code>s</code>&nbsp;里所有 <strong>子字符串的</strong>&nbsp;<strong>最大波动</strong>&nbsp;值。</p>
<p><strong>子字符串</strong> 是一个字符串的一段连续字符序列。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<b>输入:</b>s = "aababbb"
<b>输出:</b>3
<strong>解释:</strong>
所有可能的波动值和它们对应的子字符串如以下所示:
- 波动值为 0 的子字符串:"a" "aa" "ab" "abab" "aababb" "ba" "b" "bb" 和 "bbb" 。
- 波动值为 1 的子字符串:"aab" "aba" "abb" "aabab" "ababb" "aababbb" 和 "bab" 。
- 波动值为 2 的子字符串:"aaba" "ababbb" "abbb" 和 "babb" 。
- 波动值为 3 的子字符串 "babbb" 。
所以,最大可能波动值为 3 。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<b>输入:</b>s = "abcde"
<b>输出:</b>0
<strong>解释:</strong>
s 中没有字母出现超过 1 次,所以 s 中每个子字符串的波动值都是 0 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= s.length &lt;= 10<sup>4</sup></code></li>
<li><code>s</code>&nbsp; 只包含小写英文字母。</li>
</ul>

View File

@@ -0,0 +1,43 @@
<p>给你一个二维整数数组&nbsp;<code>tiles</code>&nbsp;,其中&nbsp;<code>tiles[i] = [l<sub>i</sub>, r<sub>i</sub>]</code>&nbsp;,表示所有在&nbsp;<code>l<sub>i</sub> &lt;= j &lt;= r<sub>i</sub></code>&nbsp;之间的每个瓷砖位置 <code>j</code>&nbsp;都被涂成了白色。</p>
<p>同时给你一个整数&nbsp;<code>carpetLen</code>&nbsp;,表示可以放在&nbsp;<strong>任何位置</strong>&nbsp;的一块毯子。</p>
<p>请你返回使用这块毯子,<strong>最多</strong>&nbsp;可以盖住多少块瓷砖。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<p><img alt="" src="https://assets.leetcode.com/uploads/2022/03/25/example1drawio3.png" style="width: 644px; height: 158px;" /></p>
<pre>
<b>输入:</b>tiles = [[1,5],[10,11],[12,18],[20,25],[30,32]], carpetLen = 10
<b>输出:</b>9
<b>解释:</b>将毯子从瓷砖 10 开始放置。
总共覆盖 9 块瓷砖,所以返回 9 。
注意可能有其他方案也可以覆盖 9 块瓷砖。
可以看出,瓷砖无法覆盖超过 9 块瓷砖。
</pre>
<p><strong>示例 2</strong></p>
<p><img alt="" src="https://assets.leetcode.com/uploads/2022/03/24/example2drawio.png" style="width: 231px; height: 168px;" /></p>
<pre>
<strong>输入:</strong>tiles = [[10,11],[1,1]], carpetLen = 2
<b>输出:</b>2
<b>解释:</b>将毯子从瓷砖 10 开始放置。
总共覆盖 2 块瓷砖,所以我们返回 2 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= tiles.length &lt;= 5 * 10<sup>4</sup></code></li>
<li><code>tiles[i].length == 2</code></li>
<li><code>1 &lt;= l<sub>i</sub> &lt;= r<sub>i</sub> &lt;= 10<sup>9</sup></code></li>
<li><code>1 &lt;= carpetLen &lt;= 10<sup>9</sup></code></li>
<li><code>tiles</code>&nbsp;互相 <strong>不会重叠</strong>&nbsp;</li>
</ul>

View File

@@ -0,0 +1,47 @@
<p>给你一个下标从 <strong>0</strong> 开始的字符串 <code>words</code> ,其中 <code>words[i]</code> 由小写英文字符组成。</p>
<p>在一步操作中,需要选出任一下标 <code>i</code> ,从 <code>words</code><strong>删除</strong> <code>words[i]</code> 。其中下标 <code>i</code> 需要同时满足下述两个条件:</p>
<ol>
<li><code>0 &lt; i &lt; words.length</code></li>
<li><code>words[i - 1]</code><code>words[i]</code><strong>字母异位词</strong></li>
</ol>
<p>只要可以选出满足条件的下标,就一直执行这个操作。</p>
<p>在执行所有操作后,返回 <code>words</code> 。可以证明,按任意顺序为每步操作选择下标都会得到相同的结果。</p>
<p><strong>字母异位词</strong> 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。例如,<code>"dacb"</code><code>"abdc"</code> 的一个字母异位词。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><strong>输入:</strong>words = ["abba","baba","bbaa","cd","cd"]
<strong>输出:</strong>["abba","cd"]
<strong>解释:</strong>
获取结果数组的方法之一是执行下述步骤:
- 由于 words[2] = "bbaa" 和 words[1] = "baba" 是字母异位词,选择下标 2 并删除 words[2] 。
现在 words = ["abba","baba","cd","cd"] 。
- 由于 words[1] = "baba" 和 words[0] = "abba" 是字母异位词,选择下标 1 并删除 words[1] 。
现在 words = ["abba","cd","cd"] 。
- 由于 words[2] = "cd" 和 words[1] = "cd" 是字母异位词,选择下标 2 并删除 words[2] 。
现在 words = ["abba","cd"] 。
无法再执行任何操作,所以 ["abba","cd"] 是最终答案。</pre>
<p><strong>示例 2</strong></p>
<pre><strong>输入:</strong>words = ["a","b","c","d","e"]
<strong>输出:</strong>["a","b","c","d","e"]
<strong>解释:</strong>
words 中不存在互为字母异位词的两个相邻字符串,所以无需执行任何操作。</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= words.length &lt;= 100</code></li>
<li><code>1 &lt;= words[i].length &lt;= 10</code></li>
<li><code>words[i]</code> 由小写英文字母组成</li>
</ul>

View File

@@ -0,0 +1,51 @@
<p>给你区间的 <strong></strong> 集,请你设计并实现满足要求的数据结构:</p>
<ul>
<li><strong>新增:</strong>添加一个区间到这个区间集合中。</li>
<li><strong>统计:</strong>计算出现在 <strong>至少一个</strong> 区间中的整数个数。</li>
</ul>
<p>实现 <code>CountIntervals</code> 类:</p>
<ul>
<li><code>CountIntervals()</code> 使用区间的空集初始化对象</li>
<li><code>void add(int left, int right)</code> 添加区间 <code>[left, right]</code> 到区间集合之中。</li>
<li><code>int count()</code> 返回出现在 <strong>至少一个</strong> 区间中的整数个数。</li>
</ul>
<p><strong>注意:</strong>区间 <code>[left, right]</code> 表示满足 <code>left &lt;= x &lt;= right</code> 的所有整数 <code>x</code></p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入</strong>
["CountIntervals", "add", "add", "count", "add", "count"]
[[], [2, 3], [7, 10], [], [5, 8], []]
<strong>输出</strong>
[null, null, null, 6, null, 8]
<strong>解释</strong>
CountIntervals countIntervals = new CountIntervals(); // 用一个区间空集初始化对象
countIntervals.add(2, 3); // 将 [2, 3] 添加到区间集合中
countIntervals.add(7, 10); // 将 [7, 10] 添加到区间集合中
countIntervals.count(); // 返回 6
// 整数 2 和 3 出现在区间 [2, 3] 中
// 整数 7、8、9、10 出现在区间 [7, 10] 中
countIntervals.add(5, 8); // 将 [5, 8] 添加到区间集合中
countIntervals.count(); // 返回 8
// 整数 2 和 3 出现在区间 [2, 3] 中
// 整数 5 和 6 出现在区间 [5, 8] 中
// 整数 7 和 8 出现在区间 [5, 8] 和区间 [7, 10] 中
// 整数 9 和 10 出现在区间 [7, 10] 中</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= left &lt;= right &lt;= 10<sup>9</sup></code></li>
<li>最多调用&nbsp; <code>add</code><code>count</code> 方法 <strong>总计</strong> <code>10<sup>5</sup></code></li>
<li>调用 <code>count</code> 方法至少一次</li>
</ul>