当前位置:主页 > 查看内容

leetcode--合并两个有序数组

发布时间:2021-05-19 00:00| 位朋友查看

简介:思路一 其实对待多个数组的数据处理问题最简单粗暴的方法就是新建一个数组将处理后的数据存放到新开辟的数组中对待此问题可以新建一个数组然后逐个比较数组nums1和nums2中的元素将小的数存放到新数组中然后再继续对比。直到将元数组中的元素都存放到新数组中……

在这里插入图片描述
思路一:
其实对待多个数组的数据处理问题,最简单粗暴的方法就是新建一个数组,将处理后的数据存放到新开辟的数组中,对待此问题,可以新建一个数组,然后逐个比较数组nums1和nums2中的元素,将小的数存放到新数组中,然后再继续对比。直到将元数组中的元素都存放到新数组中。但是要注意一个问题,就是当一个数组中的元素已经全部都存放到新建的数组中的时候,程序会跳出循环,此时另一个数组中仍然还剩余元素,现在要做的就是将剩下的元素依次存放到新数组中,但是仍然需要注意,问题问的是存放到数组nums1中,所以在程序的最后要将新建的nums中的元素转移到数组nums1当中。
在这里插入图片描述

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
int start1=0;
int start2=0;
int start=0;
int* nums=(int*)malloc((m+n)*sizeof(int));
memset(nums,0,(m+n)*sizeof(int));//在函数中另外创建一个数组,不能直接定义数组,利用动态内存管理开辟,并利用memset函数初始化
while(start1<m&&start2<n)
{
    if(nums1[start1]<nums2[start2])
    {
        nums[start++]=nums1[start1++];
    }
    else
    {
        nums[start++]=nums2[start2++];
    }
}
while(start1==m&&start2<n)
{
    nums[start++]=nums2[start2++];
}//当nums1数组中的所有元素都已经放到新数组中,nums2还剩余数据,直接将剩余数据拷贝到新数组
while(start1<m&&start2==n)
{
    nums[start++]=nums1[start1++];
}
for(int j=0;j<m+n;j++)
{
    nums1[j]=nums[j];
}将nums数组中的数据改放到nums1中
}

注意:在一个函数中需要一个新的数组,不能直接定义,而是要通过动态内存管理开辟一块空间,然后通过memset函数初始化,最后记得将新开辟的数组中的数据拷贝到传入的数组中
思路二:
题目中已经说明了数组nums1的空间大小为m+n,因此可以不再开辟新的数组,直接将nums2中的数据存放到数组nums1当中,把较大的数放到后面,因此要从数组的最后开始,若是nums1有效元素中最后的元素比nums2的大,则将该数据放到nums1数组的最后,否则就将nums2有效元素中最后的元素放到nums1数组的最后。
注意:该方法中,当nums2数组中的元素已经全部存放到nums1当中后,表示该过程已结束,但是当nums1中的元素已经全部都移到后面,而nums2中仍然剩余一部分元素,这时就需要把nums2中剩余的元素拷贝到nums1当中

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
int end1=m-1;
int end2=n-1;
int end=m+n-1;
while(end1>=0&&end2>=0)
{
    if(nums1[end1]<nums2[end2])
    {
        nums1[end]=nums2[end2];
        end--;
        end2--;
    }
    else
    {
        nums1[end]=nums1[end1];
        end--;
        end1--;
    }
}
while(end1<0&&end2>=0)
{
    nums1[end]=nums2[end2];
    end--;
    end2--;
}//当nums2中剩余元素,将剩余的元素拷贝到nums1中
}

在这种方法的考虑中,在nums1[end1]>nums2[end2]这个问题的解决时,刚开始时想到的是将nums1[end1]移到nums1[end]的位置,然后剩下的就是nums2[end2]向有序数组中的插入问题,显然这种思路把问题复杂化了,其实在进行赋值之后,eng1–,nums2[end2]自动与下一个元素进行比较,如此则不需要进行插入操作

;原文链接:https://blog.csdn.net/qq_52449623/article/details/115524050
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐