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