例如,给定[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)。我该如何解决?
答案 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:列表中元素的数量)
所以:
patt0
。patt1 = n - patt0
ans = min(patt0, patt1)
因此,在您的情况下,您发现翻了3次才得到5个列表,所以ans = min(3, 5-3)
就是2
。
答案 3 :(得分:0)
解决方案:
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)