LeetCode 第88题 合并两个有序数组

给定两个有序整数数组 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]

思路:
O(n+m)
与合并链表差不多.不过合并数组让我想到了归并排序的归并步骤.
正序扫描的话,如果不开辟一个新的临时数组,插入时效率会很低,所以必须开辟一个新的临时数组.扫描完再copy回nums1. 中间花费的时间很多.
倒序扫描的话,不需要开辟新的数组,虽然步骤一样,但省去了很多操作,效率高.

 1 class Solution88 {
 2 
 3   //正序
 4   public void merge(int[] nums1, int m, int[] nums2, int n) {
 5     int currNums1 = 0;
 6     int currNums2 = 0;
 7     int[] tempArray = new int[nums1.length];
 8     int currTemp = 0;
 9     while (currNums2 < n && currNums1 < m) {
10       tempArray[currTemp++] =
11         nums2[currNums2] <= nums1[currNums1] ? nums2[currNums2++] : nums1[currNums1++];
12     }
13     if (currNums1 >= m) {
14       while (currNums2 < n) {
15         tempArray[currTemp++] = nums2[currNums2++];
16       }
17     } else {
18       while (currNums1 < m) {
19         tempArray[currTemp++] = nums1[currNums1++];
20       }
21     }
22 
23     System.arraycopy(tempArray, 0, nums1, 0, nums1.length);
24     for (int i = 0; i < nums1.length; i++) {
25       System.out.println(nums1[i]);
26     }
27   }
28 
29   //倒序
30   public void merge_2(int[] nums1, int m, int[] nums2, int n) {
31     int writeIndex = nums1.length - 1;
32     int currNums2 = n - 1;
33     int currNums1 = m - 1;
34 
35     while (currNums1 >= 0 && currNums2 >= 0) {
36       nums1[writeIndex--] =
37         nums1[currNums1] < nums2[currNums2] ? nums2[currNums2--] : nums1[currNums1--];
38     }
39 
40     while (currNums1 >= 0) {
41       nums1[writeIndex--] = nums1[currNums1--];
42     }
43 
44     while (currNums2 >= 0) {
45       nums1[writeIndex--] = nums2[currNums2--];
46     }
47 
48   }
49 
50 }

猜你喜欢

转载自www.cnblogs.com/rainbow-/p/10468906.html