给定两个有序整数数组 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]
在真实的面试中遇到过这道题?
是
否
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
c#
public class Solution {
public void Merge(int[] nums1, int m, int[] nums2, int n)
{
for(int i=m+n-1;i>=0;i--)
{
if(n<=0||(m>0&&nums1[m-1]>nums2[n-1]))
nums1[i]=nums1[--m];
else
nums1[i]=nums2[--n];
}
}
}
public class Solution {
public void Merge(int[] nums1, int m, int[] nums2, int n)
{
for (int i =m;i<m+n;i++)
{
nums1[i] = nums2[i-m];
}
Array.Sort(nums1);
}
}
public class Solution {
public void Merge(int[] nums1, int m, int[] nums2, int n)
{
int i=m-1;
int j=n-1;
int k=m+n-1;
while(i>=0&&j>=0)
{
if(nums1[i]>nums2[j])
nums1[k--]=nums1[i--];
else
nums1[k--]=nums2[j--];
}
while(j>=0)
nums1[k--]=nums2[j--];
}
}
public class Solution {
public void Merge(int[] nums1, int m, int[] nums2, int n)
{
int i=m+n-1;
while(n>0)
{
if(m>0&&nums1[m-1]>nums2[n-1])
nums1[i--]=nums1[--m];
else
nums1[i--]=nums2[--n];
}
}
}
public class Solution {
public void Merge(int[] nums1, int m, int[] nums2, int n)
{
int[]temp=new int [m+n];
int i=0,j=0,count=0;
while(i<m&&j<n)
{
if(nums1[i]>nums2[j])
temp[count++]=nums2[j++];
else
temp[count++]=nums1[i++];
}
while(i<m)
{
temp[count++]=nums1[i++];
}
while(j<n)
temp[count++]=nums2[j++];
for(int z=0;z<m+n;z++)
nums1[z]=temp[z];
}
}
继续加油!
python
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
nums1[:]=nums1[0:m]+nums2[:]
nums1.sort()
return nums1
思路一直接加起来,然后排序完事
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
length=n+m
l=length
temp=[]
while m>0 or n>0:
if m==0:
nums1[:]=nums2[0:n]+nums1[length:l]
break
if n==0:
nums1[:]=nums1[0:m]+nums1[length:l]
break
if nums1[m-1]>nums2[n-1]:
nums1[length-1]=nums1[m-1]
length-=1
m-=1
else:
nums1[length-1]=nums2[n-1]
length-=1
n-=1
return nums1
第二种方法我想利用它本身已经是有序数组的特点,按照大小分别从两个数组中读取出来,然后再用读取出来的数组覆盖原来的nums1
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
length=n+m
l=length
temp=[]
while m>0 or n>0:
if m==0:
nums1[:]=nums2[0:n]+nums1[length:l]
break
if n==0:
nums1[:]=nums1[0:m]+nums1[length:l]
break
if nums1[m-1]>nums2[n-1]:
nums1[length-1]=nums1[m-1]
length-=1
m-=1
else:
nums1[length-1]=nums2[n-1]
length-=1
n-=1
return nums1
第二种方法的时候我们发现是使用了一个额外的数组空间,我们想一下可不可以省去这个数组空间直接在原nums1上进行数组的读取,我们发现题目中描述nums1中m后面的位数出差你的数据是没用的,所以假如我们按照从大到小的思路往nums1中读取数字就可以解决这些问题了,实现了节约了法二的那个数组空间。