Leetcode 88.合并两个有序数组
题目描述
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:
初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
解题思路
合并两个有序的数组,并把nums2放入nums1中,一种解题思路是逐个的比较每个数组中的元素,这里由于是本地修改,所以需要做特殊处理,即nums1中的元素与nums2中的元素想比较的时候,由于nums1中的元素在不断的修改,需要使用nums1Index+nums2Index作为下标与nums2对应的nums2Index位置的元素做比较,做个图说明一下
代码如下:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int nums1Index = 0;
int nums2Index = 0;
while (nums1Index < m && nums2Index < n){
// 逐个的比较两个数组中的元素
if (nums1[nums1Index+nums2Index] <= nums2[nums2Index]){
nums1Index++; // nums1中的元素比较小的时候,下标向后移动
}
else{
// 当nums2中的元素比较小的时候,需要把nums1当前下标位置的元素整体向后移动
for(int i = m+n-1; i>nums1Index+nums2Index; i--){
nums1[i] = nums1[i-1];
}
nums1[nums1Index+nums2Index] = nums2[nums2Index];
nums2Index++;
}
}
// 如果nums2有剩余,剩余的元素肯定比nums1中的元素都要大,直接追加在尾部
if (nums2Index != n){
for(int i=nums2Index; i<n; i++){
nums1[nums1Index+i] = nums2[i];
}
}
}
};
欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步