Skip to content

Commit 83fefc6

Browse files
authored
feat: add solutions to lc problems: No.2839~2846 (#1574)
* No.2839.Check if Strings Can be Made Equal With Operations I * No.2840.Check if Strings Can be Made Equal With Operations II * No.2841.Maximum Sum of Almost Unique Subarray * No.2842.Count K-Subsequences of a String With Maximum Beauty * No.2843.Count Symmetric Integers * No.2844.Minimum Operations to Make a Special Number * No.2845.Count of Interesting Subarrays * No.2846.Minimum Edge Weight Equilibrium Queries in a Tree
1 parent 19e2c5e commit 83fefc6

File tree

11 files changed

+85
-4
lines changed

11 files changed

+85
-4
lines changed

solution/2800-2899/2839.Check if Strings Can be Made Equal With Operations I/README.md

+12
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,18 @@
4949

5050
<!-- 这里可写通用的实现逻辑 -->
5151

52+
**方法一:计数**
53+
54+
我们观察题目中的操作,可以发现,如果字符串的两个下标 $i$ 和 $j$ 的奇偶性相同,那么它们可以通过交换改变顺序。
55+
56+
因此,我们可以统计两个字符串中奇数下标的字符的出现次数,以及偶数下标的字符的出现次数,如果两个字符串的统计结果相同,那么我们就可以通过操作使得两个字符串相等。
57+
58+
时间复杂度 $O(n + |\Sigma|)$,空间复杂度 $O(|\Sigma|)$。其中 $n$ 是字符串的长度,而 $\Sigma$ 是字符集。
59+
60+
相似题目:
61+
62+
- [2840. 判断通过操作能否让字符串相等 II](/solution/2800-2899/2840.Check%20if%20Strings%20Can%20be%20Made%20Equal%20With%20Operations%20II/README.md)
63+
5264
<!-- tabs:start -->
5365

5466
### **Python3**

solution/2800-2899/2840.Check if Strings Can be Made Equal With Operations II/README.md

+12
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,18 @@
5555

5656
<!-- 这里可写通用的实现逻辑 -->
5757

58+
**方法一:计数**
59+
60+
我们观察题目中的操作,可以发现,如果字符串的两个下标 $i$ 和 $j$ 的奇偶性相同,那么它们可以通过交换改变顺序。
61+
62+
因此,我们可以统计两个字符串中奇数下标的字符的出现次数,以及偶数下标的字符的出现次数,如果两个字符串的统计结果相同,那么我们就可以通过操作使得两个字符串相等。
63+
64+
时间复杂度 $O(n + |\Sigma|)$,空间复杂度 $O(|\Sigma|)$。其中 $n$ 是字符串的长度,而 $\Sigma$ 是字符集。
65+
66+
相似题目:
67+
68+
- [2839. 判断通过操作能否让字符串相等 I](/solution/2800-2899/2839.Check%20if%20Strings%20Can%20be%20Made%20Equal%20With%20Operations%20I/README.md)
69+
5870
<!-- tabs:start -->
5971

6072
### **Python3**

solution/2800-2899/2841.Maximum Sum of Almost Unique Subarray/README.md

+8
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,14 @@
5454

5555
<!-- 这里可写通用的实现逻辑 -->
5656

57+
**方法一:滑动窗口 + 哈希表**
58+
59+
我们可以遍历数组 $nums$,维护一个大小为 $k$ 的窗口,用哈希表 $cnt$ 统计窗口中每个元素的出现次数,用变量 $s$ 统计窗口中所有元素的和。如果 $cnt$ 中不同元素的个数大于等于 $m$,那么我们就更新答案 $ans = \max(ans, s)$。
60+
61+
遍历结束后,返回答案即可。
62+
63+
时间复杂度 $O(n)$,空间复杂度 $O(k)$。其中 $n$ 是数组的长度。
64+
5765
<!-- tabs:start -->
5866

5967
### **Python3**

solution/2800-2899/2842.Count K-Subsequences of a String With Maximum Beauty/README.md

+16
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,22 @@ s 的 k 子序列为:
8383

8484
<!-- 这里可写通用的实现逻辑 -->
8585

86+
**方法一:贪心 + 组合数学**
87+
88+
我们先用哈希表 $f$ 统计字符串 $s$ 中每个字符的出现次数,即 $f[c]$ 表示字符 $c$ 在字符串 $s$ 中出现的次数。
89+
90+
由于 $k$ 子序列是字符串 $s$ 中一个长度为 $k$ 的子序列,且字符唯一,因此,如果 $f$ 中不同字符的个数小于 $k$,那么不存在 $k$ 子序列,直接返回 $0$ 即可。
91+
92+
否则,要使得 $k$ 子序列的美丽值最大,我们需要尽可能地让美丽值大的字符尽可能地多地出现在 $k$ 子序列中。因此,我们可以对 $f$ 中的值进行倒序排序,得到一个数组 $vs$。
93+
94+
我们记数组 $vs$ 第 $k$ 个字符的出现次数为 $val$,一共有 $x$ 个字符出现的次数为 $val$。
95+
96+
那么我们先找出出现次数大于 $val$ 的字符,将每个字符出现的次数相乘,得到初始答案 $ans$,剩余的需要选取的字符个数更新为 $k$。我们需要从 $x$ 个字符中选取 $k$ 个字符,因此答案需要乘上组合数 $C_x^k$,最后再乘上 $val^k$,即 $ans = ans \times C_x^k \times val^k$。
97+
98+
注意,这里需要用到快速幂,以及取模操作。
99+
100+
时间复杂度 $O(n)$,空间复杂度 $O(|\Sigma|)$。其中 $n$ 是字符串的长度,而 $\Sigma$ 是字符集。本题中字符集为小写字母,因此 $|\Sigma| = 26$。
101+
86102
<!-- tabs:start -->
87103

88104
### **Python3**

solution/2800-2899/2843.Count Symmetric Integers/README.md

+6
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@
4242

4343
<!-- 这里可写通用的实现逻辑 -->
4444

45+
**方法一:枚举**
46+
47+
我们枚举 $[low, high]$ 中的每个整数 $x$,判断其是否是对称整数。如果是,那么答案 $ans$ 增加 $1$。
48+
49+
时间复杂度 $O(n \times \log m)$,空间复杂度 $O(\log m)$。其中 $n$ 是 $[low, high]$ 中整数的个数,而 $m$ 是题目中给出的最大整数。
50+
4551
<!-- tabs:start -->
4652

4753
### **Python3**

solution/2800-2899/2844.Minimum Operations to Make a Special Number/README.md

+13
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,19 @@
5757

5858
<!-- 这里可写通用的实现逻辑 -->
5959

60+
**方法一:记忆化搜索**
61+
62+
我们注意到,整数 $x$ 要能被 $25$ 整除,即 $x \bmod 25 = 0$。因此,我们可以设计一个函数 $dfs(i, k)$,表示从字符串 $num$ 的第 $i$ 位开始,且当前数字模 $25$ 的结果为 $k$ 的情况下,要使得数字变成特殊数字,最少需要删除多少位数字。那么答案为 $dfs(0, 0)$。
63+
64+
函数 $dfs(i, k)$ 的执行逻辑如下:
65+
66+
- 如果 $i = n$,即已经处理完字符串 $num$ 的所有位,那么如果 $k = 0$,则当前数字可以被 $25$ 整除,返回 $0$,否则返回 $n$;
67+
- 否则,第 $i$ 位可以被删除,此时需要删除一位,即 $dfs(i + 1, k) + 1$;第 $i$ 位不删除,那么 $k$ 的值变为 $(k \times 10 + \textit{num}[i]) \bmod 25$,即 $dfs(i + 1, (k \times 10 + \textit{num}[i]) \bmod 25)$。取这两者的最小值即可。
68+
69+
为了防止重复计算,我们可以使用记忆化的方法优化时间复杂度。
70+
71+
时间复杂度 $O(n \times 25)$,空间复杂度 $O(n \times 25)$。其中 $n$ 是字符串 $num$ 的长度。
72+
6073
<!-- tabs:start -->
6174

6275
### **Python3**

solution/2800-2899/2845.Count of Interesting Subarrays/README.md

+14
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,20 @@
6868

6969
<!-- 这里可写通用的实现逻辑 -->
7070

71+
**方法一:哈希表 + 前缀和**
72+
73+
题目要求一个区间内满足 $nums[i] \bmod modulo = k$ 的索引 $i$ 的数量,我们可以将数组 $nums$ 转换为一个 $0-1$ 数组 $arr$,其中 $arr[i] = 1$ 表示 $nums[i] \bmod modulo = k$,否则 $arr[i] = 0$。
74+
75+
那么对于一个区间 $[l, r]$,我们可以通过前缀和数组 $s$ 来计算 $arr[l..r]$ 中 $1$ 的数量,即 $s[r] - s[l - 1]$,其中 $s[0] = 0$。
76+
77+
我们用哈希表 $cnt$ 记录前缀和 $s \bmod modulo$ 出现的次数,初始时 $cnt[0]=1$。
78+
79+
接下来,我们遍历数组 $arr$,计算前缀和 $s$,将 $(s-k) \bmod modulo$ 出现的次数累加到答案中,然后将 $s \bmod modulo$ 出现的次数加 $1$。
80+
81+
遍历结束后,返回答案即可。
82+
83+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是数组 $nums$ 的长度。
84+
7185
<!-- tabs:start -->
7286

7387
### **Python3**

solution/2800-2899/2846.Minimum Edge Weight Equilibrium Queries in a Tree/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
<p>&nbsp;</p>
2323

2424
<p><strong class="example">示例 1:</strong></p>
25-
<img alt="" src="https://assets.leetcode.com/uploads/2023/08/11/graph-6-1.png" style="width: 339px; height: 344px;" />
25+
<img alt="" src="https://fastly.jsdelivr.net/gh/doocs/leetcode@main/solution/2800-2899/2846.Minimum%20Edge%20Weight%20Equilibrium%20Queries%20in%20a%20Tree/images/graph-6-1.png" style="width: 339px; height: 344px;" />
2626
<pre>
2727
<strong>输入:</strong>n = 7, edges = [[0,1,1],[1,2,1],[2,3,1],[3,4,2],[4,5,2],[5,6,2]], queries = [[0,3],[3,6],[2,6],[0,6]]
2828
<strong>输出:</strong>[0,0,1,3]
@@ -34,7 +34,7 @@
3434
</pre>
3535

3636
<p><strong class="example">示例 2:</strong></p>
37-
<img alt="" src="https://assets.leetcode.com/uploads/2023/08/11/graph-9-1.png" style="width: 472px; height: 370px;" />
37+
<img alt="" src="https://fastly.jsdelivr.net/gh/doocs/leetcode@main/solution/2800-2899/2846.Minimum%20Edge%20Weight%20Equilibrium%20Queries%20in%20a%20Tree/images/graph-9-1.png" style="width: 472px; height: 370px;" />
3838
<pre>
3939
<strong>输入:</strong>n = 8, edges = [[1,2,6],[1,3,4],[2,4,6],[2,5,3],[3,6,6],[3,0,8],[7,0,2]], queries = [[4,6],[0,4],[6,5],[7,4]]
4040
<strong>输出:</strong>[1,2,2,3]

solution/2800-2899/2846.Minimum Edge Weight Equilibrium Queries in a Tree/README_EN.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
<p>&nbsp;</p>
2121
<p><strong class="example">Example 1:</strong></p>
22-
<img alt="" src="https://assets.leetcode.com/uploads/2023/08/11/graph-6-1.png" style="width: 339px; height: 344px;" />
22+
<img alt="" src="https://fastly.jsdelivr.net/gh/doocs/leetcode@main/solution/2800-2899/2846.Minimum%20Edge%20Weight%20Equilibrium%20Queries%20in%20a%20Tree/images/graph-6-1.png" style="width: 339px; height: 344px;" />
2323
<pre>
2424
<strong>Input:</strong> n = 7, edges = [[0,1,1],[1,2,1],[2,3,1],[3,4,2],[4,5,2],[5,6,2]], queries = [[0,3],[3,6],[2,6],[0,6]]
2525
<strong>Output:</strong> [0,0,1,3]
@@ -31,7 +31,7 @@ For each queries[i], it can be shown that answer[i] is the minimum number of ope
3131
</pre>
3232

3333
<p><strong class="example">Example 2:</strong></p>
34-
<img alt="" src="https://assets.leetcode.com/uploads/2023/08/11/graph-9-1.png" style="width: 472px; height: 370px;" />
34+
<img alt="" src="https://fastly.jsdelivr.net/gh/doocs/leetcode@main/solution/2800-2899/2846.Minimum%20Edge%20Weight%20Equilibrium%20Queries%20in%20a%20Tree/images/graph-9-1.png" style="width: 472px; height: 370px;" />
3535
<pre>
3636
<strong>Input:</strong> n = 8, edges = [[1,2,6],[1,3,4],[2,4,6],[2,5,3],[3,6,6],[3,0,8],[7,0,2]], queries = [[4,6],[0,4],[6,5],[7,4]]
3737
<strong>Output:</strong> [1,2,2,3]

0 commit comments

Comments
 (0)