题目描述:

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.

题目给我们两个排序完毕的动态数组,让我们融合这两个数组,融合的数组还得是排好序的。其中nums1这个数组的范围是m+n。

解题思路:

这道题的思路并不难想,就是细节处理比较麻烦。

这道题的解决方法肯定是两个数组的数进行逐个比较,逐个融入。问题是从前面开始比较好?还是从后面开始比较好?从前面开始比较的话,若是我们要融入一个数,肯定要把融入数的位置后面的数全都向后推一位。从后面开始比较的话,我们可以把较大的数直接放在nums1数组的末尾。所以我选择从后面开始比较。

大体的解决方案有了,还要考虑一些特殊情形:

1.nums1数组的元素全部排完,nums2数组的元素还没排完。

  这说明nums1中的最小元素要比nums2剩余元素都要大,只要接着把nums2的剩余元素放入nums1中就行了。

2.num2数组的元素全部排完,nums1数组的元素还没排完。

  这说明nums2中的最小元素要比nums1剩余元素都要大,这种情况相当于已经结束融合,可以返回了。

3.nums1数组元素的个数m为0且nums2数组元素的个数n不为0。

  这种情况把nums2数组直接复制到nums1中即可。

4.nums2数组元素的个数n为0。

  直接返回nums1。

在这4种情况中,所有情况都是要nums2数组中的元素排完,所以我把n>0作为循环条件。

代码:

 1 class Solution {
 2 public:
 3     void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
 4         int index=m+n-1;//插入位置的下标
 5         while(n>0){
 6             if(nums1[m-1]>nums2[n-1]||m==0){
 7             //第一种和第三种情况和两个数组都未排完的情况
 8                 if(m!=0)
 9                     nums1[index--]=nums1[--m];
10                 else
11                 //这是两个数组都未排完的情况
12                     nums1[index--]=nums2[--n];
13             }
14             else
15                 nums1[index--]=nums2[--n];
16         }
17         return;
18     }
19 };

 

 

 

posted on 2018-02-06 16:17  宵夜在哪  阅读(86)  评论(0编辑  收藏  举报