1
0
mirror of https://gitee.com/coder-xiaomo/leetcode-problemset synced 2025-01-10 18:48:13 +08:00
Code Issues Projects Releases Wiki Activity GitHub Gitee
leetcode-problemset/leetcode-cn/problem (Chinese)/基于陈述统计最多好人数 [maximum-good-people-based-on-statements].html
2022-03-29 12:43:11 +08:00

80 lines
4.0 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<p>游戏中存在两种角色:</p>
<ul>
<li><strong>好人</strong>:该角色只说真话。</li>
<li><strong>坏人</strong>:该角色可能说真话,也可能说假话。</li>
</ul>
<p>给你一个下标从 <strong>0</strong> 开始的二维整数数组 <code>statements</code> ,大小为 <code>n x n</code> ,表示 <code>n</code> 个玩家对彼此角色的陈述。具体来说,<code>statements[i][j]</code> 可以是下述值之一:</p>
<ul>
<li><code>0</code> 表示 <code>i</code> 的陈述认为 <code>j</code><strong>坏人</strong></li>
<li><code>1</code> 表示 <code>i</code> 的陈述认为 <code>j</code><strong>好人</strong></li>
<li><code>2</code> 表示 <code>i</code> 没有对 <code>j</code> 作出陈述。</li>
</ul>
<p>另外,玩家不会对自己进行陈述。形式上,对所有&nbsp;<code>0 &lt;= i &lt; n</code> ,都有 <code>statements[i][i] = 2</code></p>
<p>根据这 <code>n</code> 个玩家的陈述,返回可以认为是 <strong>好人</strong><strong>最大</strong> 数目。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2022/01/15/logic1.jpg" style="width: 600px; height: 262px;">
<pre><strong>输入:</strong>statements = [[2,1,2],[1,2,2],[2,0,2]]
<strong>输出:</strong>2
<strong>解释:</strong>每个人都做一条陈述。
- 0 认为 1 是好人。
- 1 认为 0 是好人。
- 2 认为 1 是坏人。
以 2 为突破点。
- 假设 2 是一个好人:
- 基于 2 的陈述1 是坏人。
- 那么可以确认 1 是坏人2 是好人。
- 基于 1 的陈述,由于 1 是坏人,那么他在陈述时可能:
- 说真话。在这种情况下会出现矛盾,所以假设无效。
- 说假话。在这种情况下0 也是坏人并且在陈述时说假话。
- <strong>在认为 2 是好人的情况下,这组玩家中只有一个好人。</strong>
- 假设 2 是一个坏人:
- 基于 2 的陈述,由于 2 是坏人,那么他在陈述时可能:
- 说真话。在这种情况下0 和 1 都是坏人。
- <strong>在认为 2 是坏人但说真话的情况下,这组玩家中没有一个好人。</strong>
- 说假话。在这种情况下1 是好人。
- 由于 1 是好人0 也是好人。
- <strong>在认为 2 是坏人且说假话的情况下,这组玩家中有两个好人。</strong>
在最佳情况下,至多有两个好人,所以返回 2 。
注意,能得到此结论的方法不止一种。
</pre>
<p><strong>示例 2</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2022/01/15/logic2.jpg" style="width: 600px; height: 262px;">
<pre><strong>输入:</strong>statements = [[2,0],[0,2]]
<strong>输出:</strong>1
<strong>解释:</strong>每个人都做一条陈述。
- 0 认为 1 是坏人。
- 1 认为 0 是坏人。
以 0 为突破点。
- 假设 0 是一个好人:
- 基于与 0 的陈述1 是坏人并说假话。
- <strong>在认为 0 是好人的情况下,这组玩家中只有一个好人。</strong>
- 假设 0 是一个坏人:
- 基于 0 的陈述,由于 0 是坏人,那么他在陈述时可能:
- 说真话。在这种情况下0 和 1 都是坏人。
- <strong>在认为 0 是坏人但说真话的情况下,这组玩家中没有一个好人。</strong>
- 说假话。在这种情况下1 是好人。
- <strong>在认为 0 是坏人且说假话的情况下,这组玩家中只有一个好人。</strong>
在最佳情况下,至多有一个好人,所以返回 1 。
注意,能得到此结论的方法不止一种。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>n == statements.length == statements[i].length</code></li>
<li><code>2 &lt;= n &lt;= 15</code></li>
<li><code>statements[i][j]</code> 的值为 <code>0</code><code>1</code><code>2</code></li>
<li><code>statements[i][i] == 2</code></li>
</ul>