这道题目被喷的很惨,而且难度极低,基本上是个人都能做出来,但是我要说的是,一个细节的处理很重要,个人感觉是能反映出一些灵活运用的能力。
题目大体意思是这样的,给定两个从小到大的排序数组,将两个数组归并排序到第一数组里面去,第一个数组中前m个是待排元素,后n个为位置是任意数字,目的是能够放下两个数组。
这道题用常规的归并排序完全可以做,但是,既然题目专门将一个数组的大小扩充了,意味着作者并不像让我们重新申请空间,因此,根据题目我们可以从后往前做归并。这思路不难,但是有时候对于我们这样的新手可能不是那么容易想到。
具体的代码如下:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int k = m+n;
--m, --n;
while (m>=0 && n>=0) {
if (nums1[m] > nums2[n]) {
nums1[--k] = nums1[m--];
} else {
nums1[--k] = nums2[n--];
}
}
while (m>=0) {
nums1[--k] = nums1[m--];
}
while (n>=0) {
nums1[--k] = nums2[n--];
}
}
};