LeetCode 88 Merge Sorted Array

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<int>& nums1, int m, vector<int>& 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<int>& nums1, int m, vector<int>& 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 };
原文地址:https://www.cnblogs.com/VickyWang/p/6239163.html