杜鲁门的博客

所有源码均可去github下载【MyGitHub】https://github.com/androidwolf

[LeetCode]--88. Merge Sorted Array

Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.

Note:
You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. The number of elements initialized in nums1 and nums2 are m and n respectively.

这个问题假设了nums1这个数组的长度是m+n。我的考虑是,比较之后插入,如果插入就把插入处之后的往后依次挪一个。这个算法通过了。

public void merge(int[] nums1, int m, int[] nums2, int n) {
        int i = 0, j = 0;
        while (i < m && j < n) {
            if (nums2[j] < nums1[i]) {
                //这里是m,不能是m-1,因为插入一个之后变长了一个
                for (int p = m; p > i; p--)
                    nums1[p] = nums1[p - 1];
                nums1[i] = nums2[j];
                j++;
                m++;
            }
            i++;
        }
        while (j < n) {
            nums1[i] = nums2[j];
            i++;
            j++;
        }
    }

如果考虑这个题从后面一个个插入,就更简便了,效率大大提高了,不用后移那么多次了。

class Solution {
    /**
     * @param A: sorted integer array A which has m elements, 
     *           but size of A is m+n
     * @param B: sorted integer array B which has n elements
     * @return: void
     */
    public void mergeSortedArray(int[] A, int m, int[] B, int n) {
        int i = m-1, j = n-1, index = m + n - 1;
        while (i >= 0 && j >= 0) {
            if (A[i] > B[j]) {
                A[index--] = A[i--];
            } else {
                A[index--] = B[j--];
            }
        }
        while (i >= 0) {
            A[index--] = A[i--];
        }
        while (j >= 0) {
            A[index--] = B[j--];
        }
    }
}

差别就是,如果n是很短的,第一种就把nums2数组比较完了就不用管了。如果n是很长的,那么显然第二种方式更可取。

阅读更多
版权声明:本文为博主原创文章,转载请声明出处 http://blog.csdn.net/bug_moving https://blog.csdn.net/bug_moving/article/details/52728588
个人分类: LeetCode
所属专栏: LeetCode算法分析
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭