`
随便小屋
  • 浏览: 105928 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Leetcode-88-Merge Sorted Array

 
阅读更多

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 + ",");
    }

 算法性能



 

1
2
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics