当前位置: 首页 > 知识库问答 >
问题:

如何合并两个排序数组?

杨鸿畅
2023-03-14

问题是==

将nums1和nums2合并到一个按非递减顺序排序的数组中。

最终排序的数组不应由函数返回,而应存储在数组 nums1 中。为了适应这种情况,nums1 的长度为 m n,其中前 m 个元素表示应合并的元素,最后 n 个元素设置为 0 并应忽略。nums2 的长度为 n。

我的代码中有什么错误???

    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int k = 0; 
        int l = 0;
        for(int i=0; i<(m+n); i++){
            if(k > (m-1)){
                nums1[i] = nums2[l];
                l += 1;
            }
            else if(nums1[k] <= nums2[l]){
                nums1[i] = nums1[k];
                k += 1;
            }
            else {
                nums1[i] = nums2[l];
                l += 1;
            }
        }
    }
}

您的意见

[1,2,3,0,0,0]
3
[2,5,6]
3

我的产出

[1,2,2,2,5,6]

预期产出

[1,2,2,3,5,6]

共有3个答案

巢德华
2023-03-14
class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        index = 0
        for x in range(len(nums1)):
            if index>=n:
                break
            if nums1[x]==0:
                nums1[x]=nums2[index]
                index+=1
        nums1.sort()
吴哲
2023-03-14

因为在for循环中的if子句中,您基本上将第二个数组放在第一个数组的末尾,而不测试它的数字是否已经被使用。

段阳夏
2023-03-14

在合并数组时,您覆盖了nums1中的值,这样,在用nums2中的数字检查它们之前,您替换了nums1中的一些数字。在您的示例中,当您进行合并时,有一个时刻,您有< code>i=2,< code>k=2,< code>l=0,并且您的nums1看起来如下:< code>nums1=[1,2,3,0,0,0]。到目前为止,它看起来不错,但现在您有值为< code>3的< code>nums1[k]和值为< code>2的< code>nums2[l],因此您要设置< code>nums1[i]=nums2[l],即< code>nums1[2]=nums2[0]。这样,您就用来自< code>nums2的< code>2替换了< code>nums1中的< code>3,这样您就丢失了来自原始< code>nums1的< code>3,并且无法将其放入最终数组中。

此问题有两种解决方案

  1. 辅助(临时)数组,您将在其中放置数字,最后该数组将被合并并排序为nums1和nums2的数组,因此您可以将该数组复制到nums1中,以便将所有数字合并并排序到nums2中。
  2. 每次将nums2中的一个数字放入nums1的i位置时,将所有未处理的数字从原始nums1(从i位置到nums1中最后一个非零数字的数字)向前移动一个位置,以便将 位置中的数字存储在 位置,前一个 i1位置的数字将位于 i2位置等。只需保持移动这些数字的正确顺序,即从最后一个非零数字开始移动,然后返回,以避免在此过程中丢失任何数字

这些解决方案中的每一个都有自己与时间和空间复杂度相关的优点和缺点,但作为一个示例,我将展示如何实现第一种方法:

public void merge(int[] nums1, int m, int[] nums2, int n) {
    int[] mergedAndSortedArray = new int[m + n];
    int k = 0;
    int l = 0;
    for(int i=0; i<(m+n); i++){
        if(k > (m-1)){
            mergedAndSortedArray[i] = nums2[l];
            l += 1;
        }
        else if(nums1[k] <= nums2[l]){
            mergedAndSortedArray[i] = nums1[k];
            k += 1;
        }
        else {
            mergedAndSortedArray[i] = nums2[l];
            l += 1;
        }
    }

    // copy final merged and sorted array to nums1, you can also do this using `for` loop but this is more efficient way
    System.arraycopy(mergedAndSortedArray, 0, nums1, 0, m + n);
}
 类似资料:
  • 问题内容: 给定两个排序数组,如下所示: 我希望输出为: 要么: 我知道我可以执行以下操作: 我只是想知道是否有一种更快的方法,因为我要处理的数组具有数百万个元素。 任何想法都欢迎。谢谢 问题答案: 由于您使用numpy,因此我怀疑bisec根本不会对您有所帮助。因此,我建议您做两件事: 千万 不能 使用,使用方法,而不是这种种取代阵列,避免了复制。 必须使用没有到位的。因此,不要手动使用逻辑。I

  • 问题内容: 这是在采访中问我的,这是我提供的解决方案: 有没有更有效的方法可以做到这一点? 编辑:更正的长度方法。 问题答案: 稍有改进,但是在主循环之后,当到达另一个输入数组的末尾时,可以用来复制其中一个输入数组的结尾。但是,那不会改变你解决方案的性能特征。

  • 我知道类似的问题也有人问过,我也研究过很多网站。我已经尝试使用一些答案,但我的代码仍然不能工作。 我正在经历以前的作业,以帮助建立我的Java知识。请原谅我的代码中的任何错误,我还在学习Java。 假设两个输入数组中的元素都按非递减顺序排序(例如[0,1,2,2]和[1,2,3,3,4,5])。返回的“合并”数组必须保留此属性(例如[0,1,1,2,2,2,3,3,4,5])。 输入和输出都允许重

  • 本文向大家介绍手写代码:合并两个排序数组相关面试题,主要包含被问及手写代码:合并两个排序数组时的应答技巧和注意事项,需要的朋友参考一下 参考回答:  

  • 我有以下课程:

  • NowCoder 题目描述 解题思路 递归 // java public ListNode Merge(ListNode list1, ListNode list2) { if (list1 == null) return list2; if (list2 == null) return list1; if (list1.val <= lis