leetcode88---Merge Sorted Array(合并有序数组)

来源:互联网 发布:中国象棋软件哪个好 编辑:程序博客网 时间:2024/05/18 00:41

问题描述:

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];        }    }};
0 0
原创粉丝点击