简单题,一定要想出两到三种思路。比如这题,我一开始的思路,简单直观,但开辟了新的内存。
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i = 0, j = 0;
int count = 0;
vector<int> tnum = nums1;
while (i < m && j < n) {
if (tnum[i] <= nums2[j]) {
nums1[count] = tnum[i];
i++;
}
else {
nums1[count] = nums2[j];
j++;
}
count++;
}
if (i == m) {
while (j < n) {
nums1[count] = nums2[j];
count++;
j++;
}
}
else {
if (j == n) {
while (i < m) {
nums1[count] = tnum[i];
i++;
count++;
}
}
}
}
复制了一遍nums1, 特别不好,还只知道从前往后。更好的做法,就是倒过来,直接写。
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i = m-1, j = n-1, p = m+n-1;
while ((i>=0) && (j>=0)) {
if (nums1[i] >= nums2[j]) {
nums1[p] = nums1[i];
i--;
p--;
}
else {
nums1[p] = nums2[j];
j--;
p--;
}
}
if (i<0) {
while (j >= 0) {
nums1[p] = nums2[j];
j--;
p--;
}
}
}