码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-01-24 13:01:57      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:

翻译

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

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

原文

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并没有变化。

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

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

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的空间足够大。

技术分享

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

看代码……

代码

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--];
        }
    }
};

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

标签:

原文地址:http://blog.csdn.net/nomasp/article/details/50573259

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!