问题陈述: 给定A和B的数组有两个。我们需要打印第i个元素的最小互换数b / w,以便两个数组都将严格增加。
如果数组已经严格增加,则打印0。 如果不可能严格增加数组,则打印-1。
仅第ith个元素A可以与B的第ith个元素交换。
这些元素可能会出现多次。
例如:
输入:
t = 7
A = 1 2 3 8 9 7 8
B = 1 2 3 4 5 10 11
输出
2
通过将7和8与10和11交换,或者通过将8和9与4和5交换。
我的代码Python3:
t=int(input())
A=list(map(int,input().split()))
B=list(map(int,input().split()))
count=0
for i in range(1,t):
if(A[i]-A[i-1]<=0):
if(A[i]<B[i]):
if(B[i-1]<A[i]):
A[i],B[i]=B[i],A[i]
count=count+1
for i in range(1,t):
if(B[i]-B[i-1]<=0):
if(B[i]<A[i]):
if(A[i-1]<B[i]):
A[i],B[i]=B[i],A[i]
count=count+1
ans=False
for i in range(1,t):
if(A[i]-A[i-1]<=0):
ans=True
break
if(B[i]-B[i-1]<=0):
ans=True
break
if(ans):
print(-1)
else:
print(count)
我的代码说明: 我正在检查1st是否在数组A中严格增加。如果否:则检查B的第i个元素是否大于当前元素,如果是,则大于B的第i个元素,然后再检查B的第(i-1)个元素是否小于或小于交换swap的元素答:
类似的方法将应用于B。
交换后,最后一次检查A和B严格增加。如果是,则打印计数,否则打印-1。
我的代码将失败还是正确的方法的任何测试用例? 还有其他方法可以解决此问题吗?
答案 0 :(得分:2)
实际上,应该使用几种方法来重构代码。 这将很容易阅读。 我推荐一些简单的方法:
checkIncrement(list, index) : boolean return true if value at index > index -1
swap(list1,list2,index) : swap value
getWrapCount(list1,list2) : return number swap
getWrapCount方法:伪代码
size= min_size(list1,list2);
swapCount=0
for index: 1-> size
if !checkIncrement(list1,index) or !checkIncrement(list2,index)
swap(list1,list2,index);
if !checkIncrement(list1,index) or !checkIncrement(list2,index) return -1;//not possible to become strictly increasing then -1.
swapCount++;
return (swapCount,size-swapCount);
最坏情况下的复杂度为O(N),最好情况下的复杂度为O(1)。
答案 1 :(得分:1)
您的代码将失败
A = [4, 2, 3]
B = [1, 5, 6]
正确的最小交换数为1时返回2。
我们可以形成循环f(i, swap)
来表示可达到索引i
的最小交换次数,其中swap
是一个布尔值,表示索引i
上的元素是否为被交换:
f(i, false) = min(
f(i - 1, false) if A[i] > A[i-1] and B[i] > B[i-1] else Infinity,
f(i - 1, true) if A[i] > B[i-1] and B[i] > A[i-1] else Infinity
)
f(i, true) = min(
1 + f(i - 1, false) if B[i] > A[i-1] and A[i] > B[i-1] else Infinity,
1 + f(i - 1, true) if B[i] > B[i-1] and A[i] > A[i-1] else Infinity
)
(时间复杂度O(n)
。)