大家好,刷完了链表和树,来到了排序和搜索,看下题目:
思路是这样的:
如果按正常遍历,对nums2的每一位对nums1从头到尾遍历,找到合适的位置插入,这样做要移动的位数很多,时间复杂度为O(mn),且已经知道全部插入完成后nums1的长度为m+n-1.所以可以从后向前地插值。我们设置三个指针,一个temp指向nums1的第m+n-1位,一个i指向nums1的第m-1位,j指向nums2的第n-1位。将i与j的值比较,较大的那个移到temp。此外还要额外考虑一种情况,就是nums1的值全都移到temp了,nums2还有的没有插入,即nums2有的值比nums1最小的值还小。这个时候我们直接循环读入剩下的nums2的值就可以了。
代码如下:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
if(m == 0 && n != 0)
nums1 = nums2;
int i = m - 1;
int j = n - 1;
int temp = m + n - 1;
while(i >= 0 && j >= 0){
if(nums2[j] >= nums1[i]){
nums1[temp--] = nums2[j];
j--;
}
else{
nums1[temp--] = nums1[i];
if(i == 0){
while(j >= 0){
nums1[temp--] = nums2[j];
j--;
}
break;
}
else{
i--;
}
}
}
}
};
这种从后向前地思路也是我昨天晚上看剑指offer学到的,希望对大家有帮助,我们下期见!