【问题标题】:Where did I go wrong to merge two sorted arrays. They need to be merged in O(1) space complexities合并两个排序数组我哪里出错了。它们需要在 O(1) 空间复杂度中合并
【发布时间】:2021-01-02 06:21:56
【问题描述】:

对不起。我是这个论坛的新手,也是编程的新手。我看到一个问题 Merge without extra space 并尝试解决它。我没看过社论。我已经尝试为代码编写解决方案,但它似乎无法在线工作。虽然我尝试了一些我自己的测试用例,但它们似乎适用于我的原生 ide。我想知道我的代码是否正确,我想知道如何才能使它正确。

这是我的代码:

void merge(int arr1[], int arr2[], int n, int m) {  // n is the size of arr1, m is size of arr2
    int i=0;
    while(i<n){
        if (arr1[i]>arr2[0])
        {
            swap(arr1[i], arr2[0]);
        }
        for (int j=1; j<m; j++){
            if (arr2[j-1]>arr2[j]){
                swap(arr2[j-1], arr2[j]);
            }
        }
        i++;
    }
}

我希望空间复杂度为 O(1),预期时间复杂度为 O((n+m) log(n+m))。

【问题讨论】:

  • “但它似乎无法在线工作”这是什么意思?
  • 你超时了吗?您的时间复杂度是 O(n*m),当 n 和 m 都可以为 10^9 时,这是不好的。
  • 请显示minimal reproducible example,其中包含可编译代码、输入、预期输出和实际输出
  • 只是对统一数组进行堆排序。
  • 欢迎。这不是一个论坛。请花点时间阅读以下内容:stackoverflow.com/help/asking

标签: c++ arrays merge insertion-sort


【解决方案1】:

O((n+m) log(n+m) 的时间复杂度下,您可以进行常规排序。

可以创建正确的迭代器,但并非易事。

其他解决方案是先对元素进行分区,将n最低的元素放入arr1,然后将sort各部分:

void merge(int arr1[], int arr2[], int n, int m) {
    int i1 = 0;
    int i2 = 0;

    for (int i = 0; i != n; ++i) { // O(n)
        if (arr[i1] < arr2[i2]) { ++i1; }
        else { ++i2; }
    }
    // i1 + i2 == n
    for (int i = 0; i != i2; ++i) { // O(n)
        std::swap(arr2[i], arr1[i1 + i]);
    }

    std::sort(arr1, arr1 + n); // O(n log(n))
    std::sort(arr2, arr2 + m); // O(m log(m))
}

Demo.

  • O(n log(n)) &lt; O(n log(n + m))
  • O(m log(m)) &lt; O(m log(n + m))
  • O(n log(n)) + O(m log(m)) &lt; O((n + m) log(n + m))

注意:我什至相信@9​​87654330@ 中存在解决方案而无需额外的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 2012-05-07
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多