88. Merge Sorted Array*
https://leetcode.com/problems/merge-sorted-array/
题目描述
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.
Note:
- The number of elements initialized in
nums1andnums2aremandnrespectively. - You may assume that
nums1has enough space (size that is greater or equal to m + n) to hold additional elements fromnums2.
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 上, 因此在 nums1 中需要从后向前开始排序, 并且还要将 nums1 中元素中与 nums2 的元素中选出最大的开始比较. 另外还需要注意 m 和 n 不能同时为 0, 但可以有一个为 0.
扩展阅读: 这种从后向前考虑问题的题还可以看: 977. Squares of a Sorted Array* 以及 240. Search a 2D Matrix II**
C++ 实现 1
class Solution {
public:
// 注意题目已经假设 nums1 的大小至少和 m + n 一样大
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
// 这里在两者都小于 1 的情况下才返回, leetcode 有一个测试用例就是 m = 0,
// n = 1 这样也是可以的.
if (m < 1 && n < 1)
return;
// 在 nums1 的末尾开始, 实现两个数组的归并.
int k = m + n - 1;
int i = m - 1, j = n - 1;
while (i >= 0 && j >= 0) {
if (nums1[i] < nums2[j])
nums1[k--] = nums2[j--];
else
nums1[k--] = nums1[i--];
}
while (i >= 0)
nums1[k--] = nums1[i--];
while (j >= 0)
nums1[k--] = nums2[j--];
}
};
本文详细解析了LeetCode上的经典题目——合并两个有序数组(88.MergeSortedArray)的解题思路及C++实现。介绍了如何在不使用额外空间的情况下,从后向前归并两个已排序的数组,特别强调了当其中一个数组为空时的特殊情况处理。
134

被折叠的 条评论
为什么被折叠?



