Skip to content

Commit 47a8ef5

Browse files
committed
feat: add solutions to lc problem: No.2151
No.2151.Maximum Good People Based on Statements
1 parent f180226 commit 47a8ef5

File tree

7 files changed

+150
-103
lines changed

7 files changed

+150
-103
lines changed

solution/2100-2199/2151.Maximum Good People Based on Statements/README.md

+54-38
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,12 @@
9090

9191
<!-- 这里可写通用的实现逻辑 -->
9292

93+
**方法一:二进制枚举**
94+
95+
二进制枚举好人的状态 $mask$,由于“好人只说真话”,我们借此判断 $statements$ 与 $mask$ 是否存在矛盾,不存在则获取 $mask$ 中好人的数量 $cnt$。迭代获取最大的合法 $cnt$。
96+
97+
时间复杂度 $O(2^n*n^2)$,其中 $n$ 表示 $statements$ 的长度。
98+
9399
<!-- tabs:start -->
94100

95101
### **Python3**
@@ -99,18 +105,17 @@
99105
```python
100106
class Solution:
101107
def maximumGood(self, statements: List[List[int]]) -> int:
102-
def check(k):
108+
def check(mask):
103109
cnt = 0
104110
for i, s in enumerate(statements):
105-
if (k >> i) & 1:
106-
for j in range(n):
107-
if s[j] < 2 and ((k >> j) & 1) != s[j]:
111+
if (mask >> i) & 1:
112+
for j, v in enumerate(s):
113+
if v < 2 and ((mask >> j) & 1) != v:
108114
return 0
109115
cnt += 1
110116
return cnt
111-
112-
n = len(statements)
113-
return max(check(k) for k in range(1 << n))
117+
118+
return max(check(mask) for mask in range(1, 1 << len(statements)))
114119
```
115120

116121
### **Java**
@@ -119,29 +124,22 @@ class Solution:
119124

120125
```java
121126
class Solution {
122-
123-
private int n;
124-
private int[][] statements;
125-
126127
public int maximumGood(int[][] statements) {
127-
n = statements.length;
128-
this.statements = statements;
129128
int ans = 0;
130-
for (int k = 0; k < (1 << n); ++k) {
131-
ans = Math.max(ans, check(k));
129+
for (int mask = 1; mask < 1 << statements.length; ++mask) {
130+
ans = Math.max(ans, check(mask, statements));
132131
}
133132
return ans;
134133
}
135134

136-
private int check(int k) {
135+
private int check(int mask, int[][] statements) {
137136
int cnt = 0;
137+
int n = statements.length;
138138
for (int i = 0; i < n; ++i) {
139-
if (((k >> i) & 1) == 1) {
139+
if (((mask >> i) & 1) == 1) {
140140
for (int j = 0; j < n; ++j) {
141-
if (
142-
statements[i][j] < 2 &&
143-
((k >> j) & 1) != statements[i][j]
144-
) {
141+
int v = statements[i][j];
142+
if (v < 2 && ((mask >> j) & 1) != v) {
145143
return 0;
146144
}
147145
}
@@ -151,34 +149,30 @@ class Solution {
151149
return cnt;
152150
}
153151
}
154-
155152
```
156153

157154
### **C++**
158155

159156
```cpp
160157
class Solution {
161158
public:
162-
int n;
163-
vector<vector<int>> statements;
164-
165159
int maximumGood(vector<vector<int>>& statements) {
166-
n = statements.size();
167-
this->statements = statements;
168160
int ans = 0;
169-
for (int k = 0; k < (1 << n); ++k) ans = max(ans, check(k));
161+
for (int mask = 1; mask < 1 << statements.size(); ++mask) ans = max(ans, check(mask, statements));
170162
return ans;
171163
}
172164

173-
int check(int k) {
165+
int check(int mask, vector<vector<int>>& statements) {
174166
int cnt = 0;
167+
int n = statements.size();
175168
for (int i = 0; i < n; ++i)
176169
{
177-
if ((k >> i) & 1)
170+
if ((mask >> i) & 1)
178171
{
179172
for (int j = 0; j < n; ++j)
180173
{
181-
if (statements[i][j] < 2 && ((k >> j) & 1) != statements[i][j]) return 0;
174+
int v = statements[i][j];
175+
if (v < 2 && ((mask >> j) & 1) != v) return 0;
182176
}
183177
++cnt;
184178
}
@@ -193,12 +187,12 @@ public:
193187
```go
194188
func maximumGood(statements [][]int) int {
195189
n := len(statements)
196-
check := func(k int) int {
190+
check := func(mask int) int {
197191
cnt := 0
198192
for i, s := range statements {
199-
if ((k >> i) & 1) == 1 {
200-
for j := 0; j < n; j++ {
201-
if s[j] < 2 && ((k>>j)&1) != s[j] {
193+
if ((mask >> i) & 1) == 1 {
194+
for j, v := range s {
195+
if v < 2 && ((mask>>j)&1) != v {
202196
return 0
203197
}
204198
}
@@ -208,8 +202,8 @@ func maximumGood(statements [][]int) int {
208202
return cnt
209203
}
210204
ans := 0
211-
for k := 0; k < (1 << n); k++ {
212-
ans = max(ans, check(k))
205+
for mask := 1; mask < 1<<n; mask++ {
206+
ans = max(ans, check(mask))
213207
}
214208
return ans
215209
}
@@ -225,7 +219,29 @@ func max(a, b int) int {
225219
### **TypeScript**
226220

227221
```ts
228-
222+
function maximumGood(statements: number[][]): number {
223+
const n = statements.length;
224+
function check(mask) {
225+
let cnt = 0;
226+
for (let i = 0; i < n; ++i) {
227+
if ((mask >> i) & 1) {
228+
for (let j = 0; j < n; ++j) {
229+
const v = statements[i][j];
230+
if (v < 2 && ((mask >> j) & 1) != v) {
231+
return 0;
232+
}
233+
}
234+
++cnt;
235+
}
236+
}
237+
return cnt;
238+
}
239+
let ans = 0;
240+
for (let mask = 1; mask < 1 << n; ++mask) {
241+
ans = Math.max(ans, check(mask));
242+
}
243+
return ans;
244+
}
229245
```
230246

231247
### **...**

solution/2100-2199/2151.Maximum Good People Based on Statements/README_EN.md

+48-33
Original file line numberDiff line numberDiff line change
@@ -93,43 +93,39 @@ Note that there is more than one way to arrive at this conclusion.
9393
```python
9494
class Solution:
9595
def maximumGood(self, statements: List[List[int]]) -> int:
96-
def check(k):
96+
def check(mask):
9797
cnt = 0
9898
for i, s in enumerate(statements):
99-
if (k >> i) & 1:
100-
for j in range(n):
101-
if s[j] < 2 and ((k >> j) & 1) != s[j]:
99+
if (mask >> i) & 1:
100+
for j, v in enumerate(s):
101+
if v < 2 and ((mask >> j) & 1) != v:
102102
return 0
103103
cnt += 1
104104
return cnt
105-
106-
n = len(statements)
107-
return max(check(k) for k in range(1 << n))
105+
106+
return max(check(mask) for mask in range(1, 1 << len(statements)))
108107
```
109108

110109
### **Java**
111110

112111
```java
113112
class Solution {
114-
private int n;
115-
private int[][] statements;
116-
117113
public int maximumGood(int[][] statements) {
118-
n = statements.length;
119-
this.statements = statements;
120114
int ans = 0;
121-
for (int k = 0; k < (1 << n); ++k) {
122-
ans = Math.max(ans, check(k));
115+
for (int mask = 1; mask < 1 << statements.length; ++mask) {
116+
ans = Math.max(ans, check(mask, statements));
123117
}
124118
return ans;
125119
}
126120

127-
private int check(int k) {
121+
private int check(int mask, int[][] statements) {
128122
int cnt = 0;
123+
int n = statements.length;
129124
for (int i = 0; i < n; ++i) {
130-
if (((k >> i) & 1) == 1) {
125+
if (((mask >> i) & 1) == 1) {
131126
for (int j = 0; j < n; ++j) {
132-
if (statements[i][j] < 2 && ((k >> j) & 1) != statements[i][j]) {
127+
int v = statements[i][j];
128+
if (v < 2 && ((mask >> j) & 1) != v) {
133129
return 0;
134130
}
135131
}
@@ -146,26 +142,23 @@ class Solution {
146142
```cpp
147143
class Solution {
148144
public:
149-
int n;
150-
vector<vector<int>> statements;
151-
152145
int maximumGood(vector<vector<int>>& statements) {
153-
n = statements.size();
154-
this->statements = statements;
155146
int ans = 0;
156-
for (int k = 0; k < (1 << n); ++k) ans = max(ans, check(k));
147+
for (int mask = 1; mask < 1 << statements.size(); ++mask) ans = max(ans, check(mask, statements));
157148
return ans;
158149
}
159150

160-
int check(int k) {
151+
int check(int mask, vector<vector<int>>& statements) {
161152
int cnt = 0;
153+
int n = statements.size();
162154
for (int i = 0; i < n; ++i)
163155
{
164-
if ((k >> i) & 1)
156+
if ((mask >> i) & 1)
165157
{
166158
for (int j = 0; j < n; ++j)
167159
{
168-
if (statements[i][j] < 2 && ((k >> j) & 1) != statements[i][j]) return 0;
160+
int v = statements[i][j];
161+
if (v < 2 && ((mask >> j) & 1) != v) return 0;
169162
}
170163
++cnt;
171164
}
@@ -180,12 +173,12 @@ public:
180173
```go
181174
func maximumGood(statements [][]int) int {
182175
n := len(statements)
183-
check := func(k int) int {
176+
check := func(mask int) int {
184177
cnt := 0
185178
for i, s := range statements {
186-
if ((k >> i) & 1) == 1 {
187-
for j := 0; j < n; j++ {
188-
if s[j] < 2 && ((k>>j)&1) != s[j] {
179+
if ((mask >> i) & 1) == 1 {
180+
for j, v := range s {
181+
if v < 2 && ((mask>>j)&1) != v {
189182
return 0
190183
}
191184
}
@@ -195,8 +188,8 @@ func maximumGood(statements [][]int) int {
195188
return cnt
196189
}
197190
ans := 0
198-
for k := 0; k < (1 << n); k++ {
199-
ans = max(ans, check(k))
191+
for mask := 1; mask < 1<<n; mask++ {
192+
ans = max(ans, check(mask))
200193
}
201194
return ans
202195
}
@@ -212,7 +205,29 @@ func max(a, b int) int {
212205
### **TypeScript**
213206

214207
```ts
215-
208+
function maximumGood(statements: number[][]): number {
209+
const n = statements.length;
210+
function check(mask) {
211+
let cnt = 0;
212+
for (let i = 0; i < n; ++i) {
213+
if ((mask >> i) & 1) {
214+
for (let j = 0; j < n; ++j) {
215+
const v = statements[i][j];
216+
if (v < 2 && ((mask >> j) & 1) != v) {
217+
return 0;
218+
}
219+
}
220+
++cnt;
221+
}
222+
}
223+
return cnt;
224+
}
225+
let ans = 0;
226+
for (let mask = 1; mask < 1 << n; ++mask) {
227+
ans = Math.max(ans, check(mask));
228+
}
229+
return ans;
230+
}
216231
```
217232

218233
### **...**

solution/2100-2199/2151.Maximum Good People Based on Statements/Solution.cpp

+7-10
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,22 @@
11
class Solution {
22
public:
3-
int n;
4-
vector<vector<int>> statements;
5-
63
int maximumGood(vector<vector<int>>& statements) {
7-
n = statements.size();
8-
this->statements = statements;
94
int ans = 0;
10-
for (int k = 0; k < (1 << n); ++k) ans = max(ans, check(k));
11-
return ans;
5+
for (int mask = 1; mask < 1 << statements.size(); ++mask) ans = max(ans, check(mask, statements));
6+
return ans;
127
}
138

14-
int check(int k) {
9+
int check(int mask, vector<vector<int>>& statements) {
1510
int cnt = 0;
11+
int n = statements.size();
1612
for (int i = 0; i < n; ++i)
1713
{
18-
if ((k >> i) & 1)
14+
if ((mask >> i) & 1)
1915
{
2016
for (int j = 0; j < n; ++j)
2117
{
22-
if (statements[i][j] < 2 && ((k >> j) & 1) != statements[i][j]) return 0;
18+
int v = statements[i][j];
19+
if (v < 2 && ((mask >> j) & 1) != v) return 0;
2320
}
2421
++cnt;
2522
}

solution/2100-2199/2151.Maximum Good People Based on Statements/Solution.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
func maximumGood(statements [][]int) int {
22
n := len(statements)
3-
check := func(k int) int {
3+
check := func(mask int) int {
44
cnt := 0
55
for i, s := range statements {
6-
if ((k >> i) & 1) == 1 {
7-
for j := 0; j < n; j++ {
8-
if s[j] < 2 && ((k>>j)&1) != s[j] {
6+
if ((mask >> i) & 1) == 1 {
7+
for j, v := range s {
8+
if v < 2 && ((mask>>j)&1) != v {
99
return 0
1010
}
1111
}
@@ -15,8 +15,8 @@ func maximumGood(statements [][]int) int {
1515
return cnt
1616
}
1717
ans := 0
18-
for k := 0; k < (1 << n); k++ {
19-
ans = max(ans, check(k))
18+
for mask := 1; mask < 1<<n; mask++ {
19+
ans = max(ans, check(mask))
2020
}
2121
return ans
2222
}

0 commit comments

Comments
 (0)