如何解决Java MAXIMUM 结果,同时保持交替二进制序列硬币翻转问题中的最小变化 示例 3 个硬币示例 6 个硬币
我遇到了一个相当普遍的实践问题,即识别二进制序列中的重复项(通常称为“硬币翻转”问题),并且似乎很难解释它,所以请耐心等待。我需要交替二进制序列中的最小变化次数,同时返回这可能导致的最大不同输出。
例子:给定一个数组 A = [1,1,1] 有一个最小的变化可以使序列交替,使其 A = [1,0],所以changes = 1. 没有其他方法可以进行1次更改并保持交替序列。
我的问题是我必须找到可以产生的结果数量。因此,给定数组 A = [0,0] 可以产生两个最大结果。 [1,0] 或 [0,1] 都只需要更改 = 2。这可能只是我无法弄清楚正确的逻辑,请参阅下面的代码:
public class Solution {
public int Solution(int[] S) {
int changes = 0;
for (int i = 0; i < S.length - 1; i++) { //using length - 1 so my if statement doesn't go out of bounds
if (S[i] == S[i + 1]) {//How I'm detecting if a duplication has occured (and why length - 1 is necessary)
changes++;
}
if ((S.length >= 4 && i >= 1) && (S[i - 1] == S[i + 2] && S[i] == S[i + 1])) {//This is where I'm having logic issues. It really only addresses the specific instance listed above
changes++;
}
}
return changes;
}
}
当找到最小数量的可能更改时,这很有效,但不是结果。这可能只是我无法思考的逻辑问题。我见过其他人问基本相同的问题,但从未试图找到这个神话般的“最大结果”。如果该解决方案存在于其他线程中,请将其发送给我。非常感谢!
*似乎我做了一个糟糕的例子来解释我所说的最大结果的含义,我做了一个更好的例子:
如果数组 A = [1,1] 你应该返回 3,结果是 [1,0] 来改变值 1,3,和 5。这与以 [0,1] 结尾的更改数量相同。您至少需要更改至少 3 个值才能生成交替序列,但只需更改 3 次即可获得第二种结果。
解决方法
对于给定数量的硬币,只有两种可能的交替序列:一种以 0
开头,另一种以 1
开头。
假设一枚硬币只能翻转一次1,那么只能进行两种可能的更改。一个导致第一个序列,另一个导致第二个解决方案。两组变化是互补的,所以两者变化的总和一定是硬币的数量。
示例 3 个硬币
可能的序列:
0,1,0
1,1
从0,1
开始,我们可以翻转:
- 第 3 个硬币并获得第一个序列
- 翻转第一个和第二个硬币以获得第二个序列。
第二个解决方案 - 抛硬币 1
和 2
- 是第一个的 互补(逆) - 只抛硬币 3
.第一个有 1
变化,第二个 2
- 总和是 3
,硬币的数量。
结论:如果你找到了最小的变化次数,最大值必须是逆,即翻转所有其他硬币。找零次数就是硬币数量和找零次数的差值。
示例 6 个硬币
可能的序列:
0,1
1,0
从 1,1
(你的例子)开始,我们可以翻转:
- 硬币数
6
:1,0
- 计数1
- 除编号
6
外的所有:0,1
- 计数5
总和:1 + 5 = 6
,硬币数量
1 否则我们将有无数种可能的移动 - 掷硬币两次(四次、六次、... 次)会产生相同的结果>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。