Skip to content

Commit d97cf9a

Browse files
committed
feat: add solutions to lc problem: No.1711
No.1711.Count Good Meals
1 parent 3263b8f commit d97cf9a

File tree

3 files changed

+230
-0
lines changed

3 files changed

+230
-0
lines changed

solution/1700-1799/1711.Count Good Meals/README.md

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,20 @@
4343

4444
## 解法
4545

46+
**方法一:哈希表**
47+
4648
用最暴力的方法枚举每对元素肯定会超时,可以用哈希表优化对**之前元素出现次数**的查询。
4749

50+
**方法二:枚举二的幂**
51+
52+
用哈希表 `cnt` 记录数组中每个元素出现的次数。
53+
54+
枚举二的幂次方作为两数之和 `s`,然后枚举其中一个数 `a`,判断 `s-a` 是否出现在哈希表 `cnt` 中。若出现,判断 `a``b` 是否相等,是则答案累加 `cnt[a] * (cnt[a]-1)`,否则答案累加 `cnt[a] * cnt[b]`
55+
56+
由于每个 `a``b` 会重复枚举,因此最后答案需要除以 `2`。注意取模操作。
57+
58+
时间复杂度 $O(n\log C)$,其中 $n$ 是数组 `deliciousness` 的长度,而 $C$ 是元素的上限,对于本题,上限 $C=2^{20}$。
59+
4860
<!-- 这里可写通用的实现逻辑 -->
4961

5062
<!-- tabs:start -->
@@ -69,6 +81,23 @@ class Solution:
6981
return pairs
7082
```
7183

84+
```python
85+
class Solution:
86+
def countPairs(self, deliciousness: List[int]) -> int:
87+
cnt = Counter(deliciousness)
88+
ans = 0
89+
mod = 10**9 + 7
90+
for i in range(22):
91+
s = 1 << i
92+
for a, m in cnt.items():
93+
if (b := s - a) in cnt:
94+
if a == b:
95+
ans += m * (m - 1)
96+
else:
97+
ans += m * cnt[b]
98+
return (ans >> 1) % mod
99+
```
100+
72101
### **Java**
73102

74103
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -94,6 +123,37 @@ class Solution {
94123
}
95124
```
96125

126+
```java
127+
class Solution {
128+
private static final int MOD = (int) 1e9 + 7;
129+
130+
public int countPairs(int[] deliciousness) {
131+
Map<Integer, Integer> cnt = new HashMap<>();
132+
for (int v : deliciousness) {
133+
cnt.put(v, cnt.getOrDefault(v, 0) + 1);
134+
}
135+
long ans = 0;
136+
for (int i = 0; i < 22; ++i) {
137+
int s = 1 << i;
138+
for (var x : cnt.entrySet()) {
139+
int a = x.getKey(), m = x.getValue();
140+
int b = s - a;
141+
if (!cnt.containsKey(b)) {
142+
continue;
143+
}
144+
if (a == b) {
145+
ans += (long) m * (m - 1);
146+
} else {
147+
ans += (long) m * cnt.get(b);
148+
}
149+
}
150+
}
151+
ans >>= 1;
152+
return (int) (ans % MOD);
153+
}
154+
}
155+
```
156+
97157
### **Go**
98158

99159
```go
@@ -124,6 +184,57 @@ func max(x, y int) int {
124184
}
125185
```
126186

187+
```go
188+
func countPairs(deliciousness []int) int {
189+
cnt := map[int]int{}
190+
for _, v := range deliciousness {
191+
cnt[v]++
192+
}
193+
ans := 0
194+
mod := int(1e9) + 7
195+
for i := 0; i < 22; i++ {
196+
s := 1 << i
197+
for a, m := range cnt {
198+
b := s - a
199+
if n, ok := cnt[b]; ok {
200+
if a == b {
201+
ans += m * (m - 1)
202+
} else {
203+
ans += m * n
204+
}
205+
}
206+
}
207+
}
208+
ans >>= 1
209+
return ans % mod
210+
}
211+
```
212+
213+
### **C++**
214+
215+
```cpp
216+
class Solution {
217+
public:
218+
int countPairs(vector<int>& deliciousness) {
219+
unordered_map<int, int> cnt;
220+
for (int v : deliciousness) ++cnt[v];
221+
long long ans = 0;
222+
for (int i = 0; i < 22; ++i) {
223+
int s = 1 << i;
224+
for (auto& [a, m] : cnt) {
225+
int b = s - a;
226+
if (!cnt.count(b)) continue;
227+
if (a == b) ans += 1ll * m * (m - 1);
228+
else ans += 1ll * m * cnt[b];
229+
}
230+
}
231+
ans >>= 1;
232+
int mod = 1e9 + 7;
233+
return (int) (ans % mod);
234+
}
235+
};
236+
```
237+
127238
### **...**
128239
129240
```

solution/1700-1799/1711.Count Good Meals/README_EN.md

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,23 @@ class Solution:
5959
return pairs
6060
```
6161

62+
```python
63+
class Solution:
64+
def countPairs(self, deliciousness: List[int]) -> int:
65+
cnt = Counter(deliciousness)
66+
ans = 0
67+
mod = 10**9 + 7
68+
for i in range(22):
69+
s = 1 << i
70+
for a, m in cnt.items():
71+
if (b := s - a) in cnt:
72+
if a == b:
73+
ans += m * (m - 1)
74+
else:
75+
ans += m * cnt[b]
76+
return (ans >> 1) % mod
77+
```
78+
6279
### **Java**
6380

6481
```java
@@ -82,6 +99,37 @@ class Solution {
8299
}
83100
```
84101

102+
```java
103+
class Solution {
104+
private static final int MOD = (int) 1e9 + 7;
105+
106+
public int countPairs(int[] deliciousness) {
107+
Map<Integer, Integer> cnt = new HashMap<>();
108+
for (int v : deliciousness) {
109+
cnt.put(v, cnt.getOrDefault(v, 0) + 1);
110+
}
111+
long ans = 0;
112+
for (int i = 0; i < 22; ++i) {
113+
int s = 1 << i;
114+
for (var x : cnt.entrySet()) {
115+
int a = x.getKey(), m = x.getValue();
116+
int b = s - a;
117+
if (!cnt.containsKey(b)) {
118+
continue;
119+
}
120+
if (a == b) {
121+
ans += (long) m * (m - 1);
122+
} else {
123+
ans += (long) m * cnt.get(b);
124+
}
125+
}
126+
}
127+
ans >>= 1;
128+
return (int) (ans % MOD);
129+
}
130+
}
131+
```
132+
85133
### **Go**
86134

87135
```go
@@ -112,6 +160,57 @@ func max(x, y int) int {
112160
}
113161
```
114162

163+
```go
164+
func countPairs(deliciousness []int) int {
165+
cnt := map[int]int{}
166+
for _, v := range deliciousness {
167+
cnt[v]++
168+
}
169+
ans := 0
170+
mod := int(1e9) + 7
171+
for i := 0; i < 22; i++ {
172+
s := 1 << i
173+
for a, m := range cnt {
174+
b := s - a
175+
if n, ok := cnt[b]; ok {
176+
if a == b {
177+
ans += m * (m - 1)
178+
} else {
179+
ans += m * n
180+
}
181+
}
182+
}
183+
}
184+
ans >>= 1
185+
return ans % mod
186+
}
187+
```
188+
189+
### **C++**
190+
191+
```cpp
192+
class Solution {
193+
public:
194+
int countPairs(vector<int>& deliciousness) {
195+
unordered_map<int, int> cnt;
196+
for (int v : deliciousness) ++cnt[v];
197+
long long ans = 0;
198+
for (int i = 0; i < 22; ++i) {
199+
int s = 1 << i;
200+
for (auto& [a, m] : cnt) {
201+
int b = s - a;
202+
if (!cnt.count(b)) continue;
203+
if (a == b) ans += 1ll * m * (m - 1);
204+
else ans += 1ll * m * cnt[b];
205+
}
206+
}
207+
ans >>= 1;
208+
int mod = 1e9 + 7;
209+
return (int) (ans % mod);
210+
}
211+
};
212+
```
213+
115214
### **...**
116215
117216
```
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public:
3+
int countPairs(vector<int>& deliciousness) {
4+
unordered_map<int, int> cnt;
5+
for (int v : deliciousness) ++cnt[v];
6+
long long ans = 0;
7+
for (int i = 0; i < 22; ++i) {
8+
int s = 1 << i;
9+
for (auto& [a, m] : cnt) {
10+
int b = s - a;
11+
if (!cnt.count(b)) continue;
12+
if (a == b) ans += 1ll * m * (m - 1);
13+
else ans += 1ll * m * cnt[b];
14+
}
15+
}
16+
ans >>= 1;
17+
int mod = 1e9 + 7;
18+
return (int) (ans % mod);
19+
}
20+
};

0 commit comments

Comments
 (0)