Skip to content

Commit 0a2ffb2

Browse files
committed
feat: add solutions to lc problems: No.2366~2371
* No.2566.Maximum Difference by Remapping a Digit * No.2567.Minimum Score by Changing Two Elements * No.2568.Minimum Impossible OR * No.2569.Handling Sum Queries After Update * No.2570.Merge Two 2D Arrays by Summing Values * No.2571.Minimum Operations to Reduce an Integer to 0
1 parent eb6d7d4 commit 0a2ffb2

File tree

9 files changed

+91
-0
lines changed

9 files changed

+91
-0
lines changed

solution/2300-2399/2347.Best Poker Hand/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282
```python
8383
class Solution:
8484
def bestHand(self, ranks: List[int], suits: List[str]) -> str:
85+
# if len(set(suits)) == 1:
8586
if all(a == b for a, b in pairwise(suits)):
8687
return 'Flush'
8788
cnt = Counter(ranks)

solution/2300-2399/2347.Best Poker Hand/README_EN.md

+1
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ Note that we cannot make a "Flush" or a "Three of a Kind".
6565
```python
6666
class Solution:
6767
def bestHand(self, ranks: List[int], suits: List[str]) -> str:
68+
# if len(set(suits)) == 1:
6869
if all(a == b for a, b in pairwise(suits)):
6970
return 'Flush'
7071
cnt = Counter(ranks)

solution/2300-2399/2347.Best Poker Hand/Solution.py

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
class Solution:
22
def bestHand(self, ranks: List[int], suits: List[str]) -> str:
3+
# if len(set(suits)) == 1:
34
if all(a == b for a, b in pairwise(suits)):
45
return 'Flush'
56
cnt = Counter(ranks)

solution/2500-2599/2566.Maximum Difference by Remapping a Digit/README.md

+12
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,18 @@
5454

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

57+
**方法一:贪心**
58+
59+
我们先将数字转为字符串 $s$。
60+
61+
要得到最小值,我们只需要将找到字符串 $s$ 的第一个数字 $s[0]$,然后把字符串中所有的 $s[0]$ 替换成 $0$ 即可。
62+
63+
要得到最大值,我们需要找到字符串 $s$ 中第一个不是 $9$ 的数字 $s[i]$,然后把字符串中所有的 $s[i]$ 替换成 $9$ 即可。
64+
65+
最后返回最大值和最小值的差即可。
66+
67+
时间复杂度 $O(\log n)$,空间复杂度 $O(\log n)$。其中 $n$ 为数字 $num$ 的大小。
68+
5769
<!-- tabs:start -->
5870

5971
### **Python3**

solution/2500-2599/2567.Minimum Score by Changing Two Elements/README.md

+14
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,20 @@
5555

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

58+
**方法一:排序 + 贪心**
59+
60+
根据题意我们知道,最小得分实际上是排序数组相邻两个元素的最小差值,最大得分是排序数组首尾元素的差值。数组 `nums` 的分数是最小得分与最大得分的和。
61+
62+
因此,我们可以先对数组进行排序。由于题目允许我们修改数组中最多两个元素的值,我们可以通过修改一个数,让其跟数组中的另一个数相同,使得最小得分为 $0$,那么数组 `nums` 的分数实际上就是最大得分。我们可以选择进行如下修改之一:
63+
64+
1. 修改最小的两个数为 $nums[2]$,那么最大得分为 $nums[n - 1] - nums[2]$;
65+
1. 修改最小的一个数为 $nums[1]$,最大的一个数为 $nums[n - 2]$,那么最大得分为 $nums[n - 2] - nums[1]$;
66+
1. 修改最大的两个数为 $nums[n - 3]$,那么最大得分为 $nums[n - 3] - nums[0]$。
67+
68+
最后,我们返回上述三种修改的得分的最小值即可。
69+
70+
时间复杂度 $O(n \log n)$,空间复杂度 $O(\log n)$。其中 $n$ 为数组 `nums` 的长度。
71+
5872
<!-- tabs:start -->
5973

6074
### **Python3**

solution/2500-2599/2568.Minimum Impossible OR/README.md

+8
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,14 @@
4141

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

44+
**方法一:枚举 2 的幂**
45+
46+
我们从整数 $1$ 开始考虑,如果 $1$ 是可表达的,那么它必须出现在数组 `nums` 中;如果 $2$ 是可表达的,那么它必须出现在数组 `nums` 中;如果 $1$ 和 $2$ 都是可表达的,那么它们的或运算 $3$ 也是可表达的,以此类推。
47+
48+
因此,我们可以枚举 $2$ 的幂,如果当前枚举的 $2^i$ 不在数组 `nums` 中,那么 $2^i$ 就是不可表达的最小整数。
49+
50+
时间复杂度 $O(n + \log M)$,空间复杂度 $O(n)$。其中 $n$ 和 $M$ 分别是数组 `nums` 的长度和数组 `nums` 中的最大值。
51+
4452
<!-- tabs:start -->
4553

4654
### **Python3**

solution/2500-2599/2569.Handling Sum Queries After Update/README.md

+35
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,41 @@
5353

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

56+
**方法一:线段树**
57+
58+
根据题目描述:
59+
60+
- 操作 $1$ 是把数组 `nums1` 的下标区间 $[l,..r]$ 的所有数反转,即把 $0$ 变成 $1$,把 $1$ 变成 $0$。
61+
- 操作 $3$ 是求数组 `nums2` 的所有数之和。
62+
- 操作 $2$ 是把数组 `nums2` 的所有数之和加上 $p$ 乘以数组 `nums1` 所有数之和,即 $sum(nums2) = sum(nums2) + p * sum(nums1)$。
63+
64+
因此,我们实际上只需要维护数组 `nums1` 的区间和即可,我们可以通过线段树来实现。
65+
66+
我们定义线段树的每个节点为 `Node`,每个节点包含如下属性:
67+
68+
- `l`:节点的左端点,下标从 $1$ 开始。
69+
- `r`:节点的右端点,下标从 $1$ 开始。
70+
- `s`:节点的区间和。
71+
- `lazy`:节点的懒标记。
72+
73+
线段树主要有以下几个操作:
74+
75+
- `build(u, l, r)`:建立线段树。
76+
- `pushdown(u)`:下传懒标记。
77+
- `pushup(u)`:用子节点的信息更新父节点的信息。
78+
- `modify(u, l, r)`:修改区间和,本题中是反转区间中的每个数,那么区间和 $s = r - l + 1 - s$。
79+
- `query(u, l, r)`:查询区间和。
80+
81+
我们先算出数组 `nums2` 的所有数之和,记为 $s$。
82+
83+
执行操作 $1$ 时,我们只需要调用 `modify(1, l + 1, r + 1)` 即可。
84+
85+
执行操作 $2$ 时,我们更新 $s = s + p \times query(1, 1, n)$ 即可。
86+
87+
执行操作 $3$ 时,我们只需要将 $s$ 加入答案数组即可。
88+
89+
时间复杂度 $O(n + m \times \log n)$,空间复杂度 $O(n)$。其中 $n$ 和 $m$ 分别为数组 `nums1``queries` 的长度。
90+
5691
<!-- tabs:start -->
5792

5893
### **Python3**

solution/2500-2599/2570.Merge Two 2D Arrays by Summing Values/README.md

+8
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,14 @@
6060

6161
<!-- 这里可写通用的实现逻辑 -->
6262

63+
**方法一:计数 + 枚举**
64+
65+
我们可以用一个哈希表或数组 `cnt` 统计两个数组中每个数字出现的次数。
66+
67+
然后我们从小到大枚举 `cnt` 中的每个数字,如果该数字出现的次数大于 $0$,则将其加入答案数组中。
68+
69+
时间复杂度 $O(n + m)$,空间复杂度 $O(M)$。其中 $n$ 和 $m$ 分别是两个数组的长度;而 $M$ 是两个数组中数字的最大值,本题中 $M = 1000$。
70+
6371
<!-- tabs:start -->
6472

6573
### **Python3**

solution/2500-2599/2571.Minimum Operations to Reduce an Integer to 0/README.md

+11
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,17 @@
5454

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

57+
**方法一:贪心 + 位运算**
58+
59+
我们将整数 $n$ 转换为二进制,从最低位开始:
60+
61+
- 如果当前位为 $1$,我们就累加当前连续的 $1$ 的个数;
62+
- 如果当前位为 $0$,我们就判断当前连续的 $1$ 的个数是否超过 $0$。如果是,判断当前连续的 $1$ 的个数是否为 $1$,如果是,说明我们通过一次操作可以消除 $1$;如果大于 $1$,说明我们通过一次操作,可以把连续的 $1$ 的个数减少到 $1$。
63+
64+
最后,我们还需要判断当前连续的 $1$ 的个数是否为 $1$,如果是,说明我们通过一次操作可以消除 $1$;如果大于 $1$,我们通过两次操作,可以把连续的 $1$ 的消除。
65+
66+
时间复杂度 $O(\log n)$,空间复杂度 $O(1)$。其中 $n$ 为题目给定的整数。
67+
5768
<!-- tabs:start -->
5869

5970
### **Python3**

0 commit comments

Comments
 (0)