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 + ","); }
?算法性能
?
Leetcode-88-Merge Sorted Array
原文:http://972459637-qq-com.iteye.com/blog/2238044