zoukankan      html  css  js  c++  java
  • 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?此时应该考虑用一个二分法插入小的,即内存拷贝。

  • 相关阅读:
    VS2013专业版+QT5.6.3+qt-vs-addin-1.2.5环境搭建
    提权获取进程路径并获取进程列表
    解决Qt发布的程序在xp环境下提示“无法定位程序输入点 K32GetModuleFileNameExA 于动态链接库 KERNEL32.dll 上”的错误
    QT5中使用Echarts图表组件
    Qt5.9生成dll详细图文教程
    Qt 编程指南 & 选择合适的Qt5版本
    Qt 之 国际化(中英文切换)
    Qt资料
    第三次作业
    第二次作业
  • 原文地址:https://www.cnblogs.com/lyc94620/p/10641437.html
Copyright © 2011-2022 走看看