您的位置:首页 > 编程语言 > Java开发

[LeetCode][Java] Merge Sorted Array

2015-07-19 20:55 405 查看

题目:

Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.

Note:

You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. The number of elements initialized in nums1and nums2 are m and n respectively.

题意:

给定两个有序的数组nums1 and nums2,将两个数组合并为一个有序的数组。

注意:

你可以假设nums1 中具有足够大的空间(大于等于m + n)从而能够包含来自nums2
的额外的元素。nums1and nums2中起始元素的个数分别为m and n.

算法分析:

方法一:

第一次AC时没有考虑过多的空间复杂度的事情,开辟了一个新的数组来包含num1和nums2中的合并元素,然后在用这个新的数组重新覆盖nums1.

利用两个指针,分别遍历nums1和nums2,比较其中比较大的元素放入新的数组中。

方法二:

对每个数组维护一个指针,然后比较指针所指的值,每次迭代中A和B指向的元素大的便加入结果数组中,然后index-1,另一个不动。这里从后往前扫是因为这个题目中结果仍然放在A中,如果从前扫会有覆盖掉未检查的元素的可能性。

AC代码:

方法一:

<span style="font-family:Microsoft YaHei;font-size:12px;">public class Solution
{
public  void merge(int[] nums1, int m, int[] nums2, int n)
{
if(n == 0)
return;
if(m == 0)
{
for(int i=0;i<n;i++)
{
nums1[i]=nums2[i];
}
return;
}
int nums1index=0;
int nums2index=0;
int newnums[]=new int[m+n];
int i=0;
while(nums1index<=m-1&&nums2index<=n-1)//两个数组中公共长度部分
{
if(nums1[nums1index]<nums2[nums2index])
{
newnums[i]=nums1[nums1index];
nums1index++;
i++;
}
else
{
newnums[i]=nums2[nums2index];
nums2index++;
i++;
}
}
while(nums1index<=m&&nums2index<=n)
{
if(nums1index==m&&nums2index<=n-1)//数组二多于数组一的情况
{
newnums[i]=nums2[nums2index];
nums2index++;
i++;
}
else if(nums2index==n&&nums1index<=m-1)//数组一多于数组二的情况
{
newnums[i]=nums1[nums1index];
nums1index++;
i++;
}
else
break;
}
for(i=0;i<m+n;i++)
nums1[i]=newnums[i];
}
}</span>


方法二:

<span style="font-family:Microsoft YaHei;font-size:12px;">public class Solution
{
public void merge(int A[], int m, int B[], int n)
{

while(m > 0 && n > 0)
{
if(A[m-1] > B[n-1])
{
A[m+n-1] = A[m-1];
m--;
}
else
{
A[m+n-1] = B[n-1];
n--;
}
}
while(n > 0){
A[m+n-1] = B[n-1];
n--;
}
}
}</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: