上通过代码
总体思想就是根据i值遍历整个nums1,比较每一个元素大小,做融合。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n)
{
int idx1=m-1, idx2=n-1;//索引值
for(int i=n+m-1;i>=0;i--)
{
if(idx1>=0&&idx2>=0)
{
if(nums1[idx1]<=nums2[idx2])
{
nums1[i]=nums2[idx2];
idx2--;
}
else
{
nums1[i]=nums1[idx1];
nums1[idx1]=nums2[idx2];
idx1--;
}
}
else if(idx1<0&&idx2>=0)//防止出现nums[1]=[0]的情况
{
nums1[i]=nums2[idx2];
idx2--;//一定记得要递减
}
else
{
break;
}
}
}
};
错误记录。。
想单独用一个count去计nums1的size,每添加一个,后面的数就后移一位
但是看了半天没看出哪里有问题。。。有大佬帮忙解答一下就感激不尽T T
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int index1 = m-1;
int index2 = n-1;
int count1 = m-1;
for(int i=m+n-1; i>=0; i--)
{
if(index1>=0&&index2>=0)
{
if(nums1[index1]<=nums2[index2])
{
int temp= count1;
for(int j=m-1;j>=index2;j--)
{
nums1[temp+1]=nums1[temp];
//nums1[temp]=0;
temp--;
}
nums1[index1+1]=nums2[index2];
index2--;
count1++;
}
else
{
index1--;
}
}
else if(index2>=0)
{
nums1[i]=nums2[index2];
index2--;
}
else
{
break;
}
}
}
};
测试代码可以过,但是提交的时候测试出问题:
nums1 =[2,0]
m =1
nums2 =[1]
n =1
添加到测试用例
输出[1,0]
预期结果[1,2]
想复杂了,直接把i用好就可以了。