• Merge Sorted Array II


    Merge two given sorted integer array A and B into a new sorted integer array.
    
    Example
    A=[1,2,3,4]
    
    B=[2,4,5,6]
    
    return [1,2,2,3,4,4,5,6]
    
    Challenge
    How can you optimize your algorithm
    if one array is very large and the other is very small?
    

    此题要求返回新数组。由于可以生成新数组,故使用常规思路按顺序遍历即可。

    C++:

    class Solution {
    public:
        /**
         * @param A and B: sorted integer array A and B.
         * @return: A new sorted integer array
         */
        vector<int> mergeSortedArray(vector<int> &A, vector<int> &B) {
            if (A.empty()) return B;
            if (B.empty()) return A;
    
            int aLen = A.size(), bLen = B.size();
            vector<int> C;
            int i = 0, j = 0;
            while (i < aLen && j < bLen) {
                if (A[i] < B[j]) {
                    C.push_back(A[i]);
                    ++i;
                } else {
                    C.push_back(B[j]);
                    ++j;
                }
            }
    
            // A has elements left
            while (i < aLen) {
                C.push_back(A[i]);
                ++i;
            }
    
            // B has elements left
            while (j < bLen) {
                C.push_back(B[j]);
                ++j;
            }
    
            return C;
        }
    };

    JAVA:

    class Solution {
        /**
         * @param A and B: sorted integer array A and B.
         * @return: A new sorted integer array
         */
        public ArrayList<Integer> mergeSortedArray(ArrayList<Integer> A, ArrayList<Integer> B) {
            if (A == null || A.isEmpty()) return B;
            if (B == null || B.isEmpty()) return A;
    
            ArrayList<Integer> C = new ArrayList<Integer>();
            int aLen = A.size(), bLen = B.size();
            int i = 0, j = 0;
            while (i < aLen && j < bLen) {
                if (A.get(i) < B.get(j)) {
                    C.add(A.get(i));
                    i++;
                } else {
                    C.add(B.get(j));
                    j++;
                }
            }
    
            // A has elements left
            while (i < aLen) {
                C.add(A.get(i));
                i++;
            }
    
            // B has elements left
            while (j < bLen) {
                C.add(B.get(j));
                j++;
            }
    
            return C;
        }
    }

    源码分析

    分三步走,后面分别单独处理剩余的元素。

    复杂度分析

    遍历 A, B 数组各一次,时间复杂度 O(n), 空间复杂度 O(1).

    Challenge

    两个倒排列表,一个特别大,一个特别小,如何 Merge?此时应该考虑用一个二分法插入小的,即内存拷贝。

  • 相关阅读:
    sqlserver判断字段是否存在,表是否存在
    sqlserver数据库数据字典生成器
    C#断点续传下载文件
    c# 泛型new T
    html显示xml内容
    程序设计语言诞生——程序设计语言的发展历史
    atan2(x,y) pow(x,y)
    name phone email 正则表达式
    第八周
    第六周
  • 原文地址:https://www.cnblogs.com/lyc94620/p/10641437.html
Copyright © 2020-2023  润新知