1,题目要求
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.
Note:
- The number of elements initialized in nums1 and nums2 are m and n respectively.
- You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2.
Example:
Input:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
Output:[1,2,2,3,5,6]
给定两个排序的整数数组nums1和nums2,将nums2合并为nums1作为一个排序的数组。
注意:
- 在nums1和nums2中初始化的元素数分别为m和n。
- 您可以假设nums1有足够的空间(大小大于或等于m + n)来保存nums2中的其他元素。
2,题目思路
对于这道题,要求将两个有序的数组合并到其中一个数组中并保持有序。
这道题的特殊之处在于,对于两个连续的数组,第一个数组的长度是大于等于两个数组中有效数字之和的。
题目要求不要开辟新的空间,就能将两个数组排序成功。
如果我们按照常规的合并数组的策略——从前往后进行比较,不是不行,但是可能会有大量的将nums1中的元素向后移动的操作。
因此,剑走偏锋,一个聪明的办法,就是从后往前来进行比较并合并两个数组。
需要注意的是,一开始个人认为循环条件只需要保证j>=0即可——i剩下的都是在前面并有序的,但是两个数组有nums1中的元素全部大于nums2中的元素的情况,因此,需要两个循环:
- 第一个循环,条件是i>=0 && j>=0
- 第二个循环,条件是j>=0
3,代码实现
int x = []() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
return 0;
}();
class Solution {
public:
void merge(vector<int> &nums1, int m, vector<int> &nums2, int n) {
int i = m-1, j = n-1, k = m + n -1;
while(i>=0 && j >=0)
{
if(nums1[i]>nums2[j])
nums1[k--] = nums1[i--];
else
nums1[k--] = nums2[j--];
}
//这样的while循环下来,nums1中的所有的数字一定都还在nums1中
//因为是从后往前的构建,因此不会出现覆盖的问题
while(j>=0) nums1[k--] = nums2[j--];
}
};