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:
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 和nums2,将数组nums2中的元素归并到数组nums1中。题目已经假设数组nums1 中拥有足够的空降将数组nums2 中的元素加入到其中。
解析:
方法一:按照最常规的方法从前往后归并。申请一个空间为m+n的数组nums3 ,将两个数组中的元素归并到数组nums3 中,程序结束时再将数组nums3 中的元素复制到数组nums1 中。此方法必须申请额外的空间来存储数组nums3 ,并且在还得数组nums3 中的数据复制到数组nums1 中,此方法拥有较高的时间和空间复杂度。
方法二:
从后向前归并。由于数组nums1 拥有足够的空间可以容纳m+n个元素,则可以利用nums1中的空间进行从后向前归并。i记录nums1中最后一个元素的位置,j记录nums2中最后一个元素的位置,k记录两个数组归并后最后一个元素的位置。图解如下图所示
Java 代码
public void merge(int[] nums1, int m, int[] nums2, int n) {
if((nums1==null) && (nums2==null))
return;
/**
* 记录nums1中最后一个元素的位置
*/
int i = m-1;
/**
* 记录nums2中最后一个元素的位置
*/
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--];
}
}
//add remains elements to result
while(j>=0) {
nums1[k--] = nums2[j--];
}
for(int a: nums1)
System.out.print(a + ",");
}
算法性能