您的位置:首页 > 其它

LeetCode 88 Merge Sorted Array(合并排序数组)(*)

2016-01-24 12:06 471 查看

翻译

[code]给定两个排序的整型数组nums1和nums2,将nums2合并到nums1成一个排序数组。

批注:
你可以假设nums1中有足够的空间(空间大于或等于m+n)来存放来自nums2的额外元素。
nums1和nums2的初始空间分别是m和n。


原文

[code]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.


分析

有一种思路是,另外设置一个数组,然后将nums1和nums2中的数据按大小逐个添加到这个新数组中,最后将这个数组整个赋值给nums1,不过像是作弊一样,题意说了是要并到nums1中的,这样一来nums1并没有变化。

所以,继续想新的方法……

先来理一理,有如下这些关系:

[code]1,m和n表示的是nums1和nums2中已经初始化的元素数量,
而并非nums1和nums2的空间大小,也就是说nums1中空间足够大,
但其中m个空间设置了该设的值,我们在本题中称它为有效数目

2,由1得出合并后的总的有效数目为m+n

3,因为都是从0开始,所以nums1和nums2的最后一个元素的索引分别是m-1和n-1,
合并后的nums1的最后一个元素的索引应该是m+n-1

4,我们是将nums2并入nums1,所以整体的循环可以从nums2开始

5,下面我会阐述为什么内部的循环要从nums1的尾部开始:

因为这是vector数组而不是链表,它们是有索引的,索引是从前到后的(从0到m-1)
如果在数组前方添加一个数字,那么其后的所有元素都需要往后挪一步
而如果在后方添加一个数字,前面的则不需要移动。
至于为什么不担心后方空间问题,因为题目说了给nums1的空间足够大。




原谅我没有再给数组画竖线以区分每个格子,相信大家都懂的,我已经尽力了,哈哈……

看代码……

代码

[code]class Solution {
public:
    void merge(vector<int> &nums1, int m, vector<int> &nums2, int n) {
        int i = m - 1, j = n - 1, position = m + n - 1;
        while (j >= 0) {
            nums1[position--] = i >= 0 && nums1[i] > nums2[j] ? nums1[i--] : nums2[j--];
        }
    }
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: