File tree 9 files changed +91
-0
lines changed
2300-2399/2347.Best Poker Hand
2566.Maximum Difference by Remapping a Digit
2567.Minimum Score by Changing Two Elements
2568.Minimum Impossible OR
2569.Handling Sum Queries After Update
2570.Merge Two 2D Arrays by Summing Values
2571.Minimum Operations to Reduce an Integer to 0
9 files changed +91
-0
lines changed Original file line number Diff line number Diff line change 82
82
``` python
83
83
class Solution :
84
84
def bestHand (self , ranks : List[int ], suits : List[str ]) -> str :
85
+ # if len(set(suits)) == 1:
85
86
if all (a == b for a, b in pairwise(suits)):
86
87
return ' Flush'
87
88
cnt = Counter(ranks)
Original file line number Diff line number Diff line change @@ -65,6 +65,7 @@ Note that we cannot make a "Flush" or a "Three of a Kind".
65
65
``` python
66
66
class Solution :
67
67
def bestHand (self , ranks : List[int ], suits : List[str ]) -> str :
68
+ # if len(set(suits)) == 1:
68
69
if all (a == b for a, b in pairwise(suits)):
69
70
return ' Flush'
70
71
cnt = Counter(ranks)
Original file line number Diff line number Diff line change 1
1
class Solution :
2
2
def bestHand (self , ranks : List [int ], suits : List [str ]) -> str :
3
+ # if len(set(suits)) == 1:
3
4
if all (a == b for a , b in pairwise (suits )):
4
5
return 'Flush'
5
6
cnt = Counter (ranks )
Original file line number Diff line number Diff line change 54
54
55
55
<!-- 这里可写通用的实现逻辑 -->
56
56
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
+
57
69
<!-- tabs:start -->
58
70
59
71
### ** Python3**
Original file line number Diff line number Diff line change 55
55
56
56
<!-- 这里可写通用的实现逻辑 -->
57
57
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
+
58
72
<!-- tabs:start -->
59
73
60
74
### ** Python3**
Original file line number Diff line number Diff line change 41
41
42
42
<!-- 这里可写通用的实现逻辑 -->
43
43
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
+
44
52
<!-- tabs:start -->
45
53
46
54
### ** Python3**
Original file line number Diff line number Diff line change 53
53
54
54
<!-- 这里可写通用的实现逻辑 -->
55
55
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
+
56
91
<!-- tabs:start -->
57
92
58
93
### ** Python3**
Original file line number Diff line number Diff line change 60
60
61
61
<!-- 这里可写通用的实现逻辑 -->
62
62
63
+ ** 方法一:计数 + 枚举**
64
+
65
+ 我们可以用一个哈希表或数组 ` cnt ` 统计两个数组中每个数字出现的次数。
66
+
67
+ 然后我们从小到大枚举 ` cnt ` 中的每个数字,如果该数字出现的次数大于 $0$,则将其加入答案数组中。
68
+
69
+ 时间复杂度 $O(n + m)$,空间复杂度 $O(M)$。其中 $n$ 和 $m$ 分别是两个数组的长度;而 $M$ 是两个数组中数字的最大值,本题中 $M = 1000$。
70
+
63
71
<!-- tabs:start -->
64
72
65
73
### ** Python3**
Original file line number Diff line number Diff line change 54
54
55
55
<!-- 这里可写通用的实现逻辑 -->
56
56
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
+
57
68
<!-- tabs:start -->
58
69
59
70
### ** Python3**
You can’t perform that action at this time.
0 commit comments