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);
            }
        }
  • 相关阅读:
    Microsoft Exchange Mail Flow Rule
    Microsoft Exchange Inactive mailbox
    Microsoft Exchange In-Place Hold and Litigation Hold
    Microsoft Exchange eDiscovery
    Microsoft Exchange Retention Policy
    JavaScript Array 操作
    CSS选择器优先级
    CSS实现垂直居中
    watch和computed和methods区别是什么?
    什么是async和await? 怎么捕获异常?
  • 原文地址:https://www.cnblogs.com/aboutblank/p/4358237.html
Copyright © 2011-2022 走看看