【问题标题】:sort two arrays in O(n) (time and space)在 O(n) 中对两个数组进行排序(时间和空间)
【发布时间】:2018-06-13 15:50:21
【问题描述】:

给定两个(可能未排序的)数组,AB 以及交换元素 A[i]B[i] 的操作 swap(A, B, i),您需要返回最小交换次数,因此这两个数组是严格增加(或-1,如果不可能)

我很快就想出了一个贪婪的解决方案(如果你愿意,我可以附上代码),但显然在某些情况下它不会产生正确的答案(我不知道)。

为什么贪婪的方法不够好? 达到最少掉期数量的替代方法是什么?

编辑:
这是我的代码

def solution(A, B):
    n = len(A)
    swaps = 0
    for i in range(1, n):

        if A[i] > A[i - 1] and B[i] > B[i - 1]:
            continue

        if A[i] < A[i - 1] and B[i] < B[i - 1]:
            return -1
        elif A[i] < A[i - 1]:
            if B[i - 1] < A[i]:
                A[i], B[i] = B[i], A[i]
                swaps += 1
            else:
                return -1
        else:
            # B[i] < B[i - 1]
            if A[i - 1] < B[i]:
                A[i], B[i] = B[i], A[i]
                swaps += 1
            else:
                return -1


    return swaps

# test
assert(solution([5, 3, 7, 7, 10], [1, 6, 6, 9, 9]))

【问题讨论】:

  • “为什么贪婪的方法不够好?”不知道你用了什么贪婪的方法,我们怎么知道
  • 添加你尝试过的代码
  • @juvian,你是对的。我附上代码
  • @Elimination 您是否在在线网站上发布此内容?你知道 A 和 B 总是有相同的长度吗?
  • @juvian,是的,很抱歉没有提及。 A 和 B 的长度相同

标签: algorithm data-structures computer-science


【解决方案1】:

您可以使用 DP 来实现:

一种方法可以是: 对于每一对 A[i] 和 B[i],我们可以选择交换或不交换。所以我们定义了两个 dp 数组,keep[i] 表示如果我们不交换 A[i] 和 B[i],交换的最小次数是多少。 swap[i] 是交换 A[i] 和 B[i] 的最小交换次数。

  • A[i] > A[i -1] && B[i] > B[i - 1], 如果我们选择保留,我们应该保留之前的 i - 1 个元素。所以保持[i] = 保持[i - 1] 如果我们选择交换,为了保持排序顺序,我们必须交换前面的第 i - 1 个元素。所以swap[i] = swap[i - 1] + 1;

  • A[i] > B[i - 1] && B[i] > A[i - 1] 如果我们选择保留,keep[i] = Math.min(keep[i], swap[i - 1]) 如果我们选择交换,swap[i] = Math.min(swap[i], keep[i - 1] + 1)

  • 对于A[i]

时间复杂度:O(n)

【讨论】:

  • 非常感谢(我有过 DP 的念头,但我放弃了)。我会尝试从这里开始!
  • 是不是比这复杂一点?当您查看第 (i-1) 个位置时,它可能会被交换,因此您需要相应地考虑这两种情况。
  • @Elimination 它涵盖了大多数边缘情况,您可以在继续进行时添加更多内容。并且在维护数组时必须小心,并确保正确实现所有案例。
  • 最后一个问题,我指的是案例 2:假设我们希望保持第 i 个元素不变。不就是keep[i] = swap[i - 1]。我不明白Math.min() 的用法。
  • 为了演示这个案例,我们可以查看A=[3, 10], B=[5, 4]。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 2015-06-25
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多