交替1和0的最小数目

时间:2019-07-13 05:31:27

标签: python algorithm

例如,给定[1、1、0、1],我想找到获得[0、1、0、1]交替的最小翻转次数。所以在这种情况下,这是一个翻转。

def solution(A):
    count = 0
    myDict = {}
    myDict[1] = True
    myDict[0] = False

    next = None
    # first element value
    val = myDict[A[0]]
    if val == True:
        next = False
    else:
        next = True

    for element in A[1:]:
        if next != myDict[element]:
            count += 1
            # do something to update element
            myDict[element] = next
        if myDict[element] == True:
            next = False
        else:
            next = True

    return count

我的解决方案不适用于输入[1,1,0,1,1]。因为当答案应为2时它会返回3(将第一个索引和最后一个索引元素更改为0)。我该如何解决?

5 个答案:

答案 0 :(得分:3)

您可以只计算每种模式的差异并采用min

def minFlip(a):
    return min(
        sum(n == i % 2 for i, n in enumerate(a)),
        sum(n == (i + 1) % 2 for i, n in enumerate(a))
    )

minFlip([1, 1, 0, 1, 1])
#2
minFlip([0, 1, 0, 1, 0])
#0
minFlip([1, 1, 1, 1, 1])
#2
minFlip([0, 0, 0, 0, 0])
#2

答案 1 :(得分:3)

您可以计算最低有效位与索引不同的值。然后计算该计数或“相反”(透镜计数):

def minFlip(a):
    flips = sum((n ^ i) & 1 for i, n in enumerate(a))
    return min(flips, len(a)-flips)

或者,您可以根据该位求和1和-1,然后从中得出解决方案:

def minFlip(a):
    return (len(a)-abs(sum(-1 if (n^i)&1 else 1 for i,n in enumerate(a)))) // 2

答案 2 :(得分:2)

(获得以0开头的交替模式的翻转次数)+(获得以1开头的交替模式的翻转次数)=(n:列表中元素的数量)

所以:

  1. 找出要实现从0开始的交替模式需要进行多少次翻转。将此称为patt0
  2. patt1 = n - patt0
  3. ans = min(patt0, patt1)

因此,在您的情况下,您发现翻了3次才得到5个列表,所以ans = min(3, 5-3)就是2

答案 3 :(得分:0)

解决方案:

  • 图案的形式为0,1;可以在模式
  • 中设置
  • 循环输入值
  • 如果为1,3,5 ..(奇数元素)
    • 如果值不为false,则在翻转时加1
  • 如果为2,4,6(偶数元素)
    • 如果值不为true,则在翻转时加1
  • 返回翻转
def getFlips(input_value):
  pattern = [False, True]
  flips = 0
  for i in range(len(input_value)):
    if i % 2 == 1:
      flips += (1 if input_value[i] != pattern[0] else 0)
    elif i % 2 == 0:
      flips += (1 if input_value[i] != pattern[1] else 0)
  return flips

示例:

print(getFlips([True, True, True, False])) == 1

答案 4 :(得分:0)

为完整起见,这是一个O(1)空间基本动态编程,与其他建议的解决方案没有太大不同,但是可以看到here开始超越使用列表推导的解决方案。

def f(A):
  a, b = 0, 0
  for i in xrange(len(A)):
    m = i & 1 ^ A[i]
    a, b = m + a, (not m) + b
  return min(a, b)