Problem:
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 nums1 and nums2 are m and n respectively.Summary:
将已排序数组nums1和nums2 merge进nums1中,其中nums1和nums2的初始化元素数目分别为m和n。
默认nums1的空间大于m+n。
Solution:
1. 由于nums1有m个元素,nums2有n个元素,最终数组有m + n个元素。
我们从第m + n - 1个元素开始向前排列新数组,我所理解的原因为:
若从前往后排列数组,需要多次整体后移nums1数组中原有元素的位置,时间复杂度过低。而从后往前排列,可以在保证保留nums1未排列数组位置的情况下降低时间复杂度。
1 class Solution { 2 public: 3 void merge(vector & nums1, int m, vector & nums2, int n) { 4 int i = m - 1, j = n - 1; 5 int next = m + n - 1; 6 while (j >= 0) { 7 nums1[next--] = i >= 0 && nums1[i] > nums2[j] ? nums1[i--] : nums2[j--]; 8 } 9 }10 };
2. 首先将nums2的所有元素接在nums1后面,再用冒泡排序法对整个数组进行排序。
1 class Solution { 2 public: 3 void merge(vector & nums1, int m, vector & nums2, int n) { 4 for (int i = 0; i < n; i++) { 5 nums1[m + i] = nums2[i]; 6 } 7 8 int len = m + n; 9 for (int i = 0; i < len - 1; i++) {10 for (int j = i + 1; j < len; j++) {11 if (nums1[i] > nums1[j]) {12 int tmp = nums1[i];13 nums1[i] = nums1[j];14 nums1[j] = tmp;15 }16 }17 }18 }19 };