Java MAX 结果,同时保持交替二进制序列(硬币翻转)问题的最小变化



我遇到了一个关于识别二进制序列中重复项的相当常见的实践问题(通常称为"硬币翻转"问题),并且似乎难以解释它,所以请耐心等待。我需要交替二进制序列中的最小更改次数,同时返回可能导致的最大不同输出。

示例:给定一个数组 A = [1, 0, 1, 0, 1, 1],可以进行一个最小更改以使序列交替,使其 A = [1, 0, 1, 0, 1, 0],因此更改 = 1。没有其他方法可以进行 1 次更改并保持交替序列。

我的问题是我必须找到可以产生的结果的数量。因此,给定数组 A = [0, 1, 1, 0],可以产生两个最大结果。[1, 0, 1, 0] 或 [0, 1, 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, 1, 1, 1, 1] 时,应返回 3,结果为 [1, 0, 1, 0, 1, 0] 来更改值 1、3 和 5。这与以 [0, 1, 0, 1, 0, 1] 结尾的更改数相同。您至少需要更改至少 3 个值才能进行交替序列,但只有 3 个更改就可能出现第二种结果。

给定数量的硬币只有两种可能的交替序列:一种以0开头,另一种以1开头。
假设一枚硬币只能掷出一次1,那么只能进行两组可能的更改。一个导致第一个序列,另一个导致第二个解决方案。两组变化是互补的,所以两者的变化之和必须是硬币的数量。

<小时 />

例3个硬币

可能的顺序:

  • 0, 1, 0
  • 1, 0, 1

0, 1, 1开始,我们可以翻转:

  • 第三枚硬币并获得第一个序列
  • 翻转第一个和第二个硬币以获得第二个序列。

第二种解决方案 - 抛硬币12- 是第一个 - 抛硬币3补充(相反)。第一有1变化,第二2-总和是3,硬币的数量。

结论:如果您发现最小变化次数,则最大值必须是反向的,即抛出所有其他硬币。更改次数只是硬币数量与最小更改次数之间的差额。


例 6 个硬币

可能的顺序:

  • 0, 1, 0, 1, 0, 1
  • 1, 0, 1, 0, 1, 0

1, 0, 1, 0, 1, 1(您的示例)开始,我们可以翻转:

  • 硬币数量61, 0, 1, 0, 1, 0- 计数1
  • 除数字6外的所有:0, 1, 0, 1, 0, 1- 计数5

总和:1 + 5 = 6,硬币数量


1否则我们将有无限数量的可能动作 - 掷硬币两次(四、六、...倍)将产生相同的结果

最新更新