相对排序,尽可能减少交换

时间:2019-10-05 04:33:18

标签: arrays algorithm sorting data-structures

问题陈述: 给定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。


我的代码将失败还是正确的方法的任何测试用例? 还有其他方法可以解决此问题吗?

2 个答案:

答案 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)。)