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

时间:2021-05-27 04:13:29

翻译

给定两个排序的整型数组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的空间足够大。

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

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

看代码……

代码

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