zoukankan      html  css  js  c++  java
  • Merge Sorted Array——LeetCode

    Given two sorted integer arrays A and B, merge B into A as one sorted array.

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

    https://leetcode.com/problems/merge-sorted-array/

    题意就是给定两个有序数组,把B中的元素合并到A中,可以假定A中有足够的空间。

    怎么做才能是时间复杂度最低呢,与合并两个有序链表不同,两个数组的元素是可以通过下标直接访问的,而且要合并两个数组,元素肯定是要移动的,不像链表中改变一下next指针就可以了。最优的方式当时是从后往前遍历,因为合并的数组大小为m+n,那么合并后的数组最后一个元素的下标就是m+n-2,依次比较两个数组最末的元素,把较大的一个放置在合并后的数组的末端。

    Talk is cheap>>

    首先上清晰版,边界也清晰的处理了:

       public void merge(int A[], int m, int B[], int n) {
            int i = 1, j = 1;
            if (m == 0) {
                System.arraycopy(B,0,A,0,n);
                return;
            }
            if (n == 0)
                return;
            while (i <= m && j <= n) {
                while (i <= m && j <= n && A[m - i] >= B[n - j]) {
                    A[m + n - i - j + 1] = A[m - i];
                    i++;
                }
                while (i <= m && j <= n && A[m - i] < B[n - j]) {
                    A[m + n - i - j + 1] = B[n - j];
                    j++;
                }
            }
            if (j <= n) {
                System.arraycopy(B, 0, A, 0, m + n - i - j + 2);
            }
        }

    下面是压缩版,把边界条件缩入了while和if的判断中,并且压缩了while主循环,两个方法的执行时间几乎是一样的:

       public void merge(int A[], int m, int B[], int n) {
            int i = 1, j = 1;
            while (i <= m && j <= n) {
                A[m + n - i - j + 1] = A[m - i] > B[n - j] ? A[m - i++] : B[n - j++];
            }
            if (j <= n) {
                System.arraycopy(B, 0, A, 0, m + n - i - j + 2);
            }
        }
  • 相关阅读:
    国际标准:ISO 8601
    Python中文问题SyntaxError
    主人与狗
    三星Galaxy note I9220 N7000 刷机ROOT工具及ROM下载
    电子书下载:Pro ASP.NET 4 in C# 2010
    Rad Studio IDE 代码编辑器增强工具 RADSplit
    电子书下载:Essential Windows Phone 7.5
    3D成像法:抖动
    减小delphi生成EXE文件体积的方法
    unisynedit 在Delphi 2010下的编译问题
  • 原文地址:https://www.cnblogs.com/aboutblank/p/4358237.html
Copyright © 2011-2022 走看看