leetcode88---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.

两个有序数组A[],B[],假设A有足够空间,将两个数组合并到A中,使之有序。

问题求解:

方法一:从后往前遍历两数组(尾插法),将大的放在后面,无需另外开辟空间,时间复杂度度O(m+n)。

class Solution {
public://时间复杂度O(m+n)
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int index = m+n-1;//合并后数组索引
        int aindex = m-1;//a数组索引
        int bindex = n-1;//b数组索引
        while(aindex >= 0 && bindex >= 0)
        {//从后往前遍历,把最大的放在最后面
            if(nums1[aindex] > nums2[bindex])
            {
                nums1[index--] = nums1[aindex--];
            }
            else
            {
                nums1[index--] = nums2[bindex--];
            }
        }
        while(aindex >= 0)
        {
            nums1[index--] = nums1[aindex--];
        }
        while(bindex >= 0)
        {
            nums1[index--] = nums2[bindex--];
        }
    }
};

更简洁一点:

class Solution {
public://时间复杂度O(m+n)
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int index = m+n-1;//合并后数组索引
        int aindex = m-1;//a数组索引
        int bindex = n-1;//b数组索引
        while(aindex >= 0 && bindex >= 0)
        {//从后往前遍历,把最大的放在最后面
            nums1[index--] = nums1[aindex]>nums2[bindex]?nums1[aindex--]:nums2[bindex--];
        }
        while(aindex >= 0)
        {
            nums1[index--] = nums1[aindex--];
        }
        while(bindex >= 0)
        {
            nums1[index--] = nums2[bindex--];
        }
    }
};

方法二:从前往后遍历数组,需要另开辟一个临时数组,不如方法一更优。

class Solution {
public://时间复杂度O(m+n) 空间复杂度O(m+n)
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int index = 0;//合并后数组索引
        int aindex = 0;//a数组索引
        int bindex = 0;//b数组索引
        int tmp[m+n];//开辟一个临时数组
        while(aindex < m && bindex < n)
        {//从前往后
            tmp[index++] = nums1[aindex]<nums2[bindex]?nums1[aindex++]:nums2[bindex++];
        }
        while(aindex < m)
        {
            tmp[index++] = nums1[aindex++];
        }
        while(bindex < n)
        {
            tmp[index++] = nums2[bindex++];
        }
        //将临时数组的数放到a数组
        while(--index >= 0)
        {//因为前面index++完后index多加一次,因此首先要--index
            nums1[index] = tmp[index];
        }
    }
};
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/will130/article/details/50519452
文章标签: leetcode
个人分类: leetcode
想对作者说点什么? 我来说一句

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

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