给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:
初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
思路:看到题的时候在想好简单,直接把第二个数组的值填进第一个里再利用 sort()函数不就好了,代码如下:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i;
int j=0;
for(i=m ; i<m+n ;++i)
{
nums1[i]=nums2[j];
j++;
}
sort(nums1.begin(),nums1.end());
}
};
后来一看题解说是用别的方法,因为没有利用两个数组皆有序这一重要条件。但我想如果真遇到这种情况,能解出来的就是好算法。下面是严谨的思路:
双指针法,比较两个数组的最大值,比较后由大到小插入到nums1的后面,从而减少了不必要的空间损耗
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int p1=m-1,p2=n-1;
int x=m+n-1;
while(p1>=0 && p2>=0)
{
if(nums1[p1] > nums2[p2])
{
nums1[x--] = nums1[p1--];
}
else
{
nums1[x--] = nums2[p2--];
}
}
if(p1 >= 0 )
{
while(p1 >=0)
{
nums1[x--] = nums1[p1--];
}
}
else if(p2 >= 0 )
{
while(p2 >=0)
{
nums1[x--] = nums2[p2--];
}
}
if(m == 0)
{
nums1=nums2;
}
}
};
来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/me…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。