这道题可以说是,让一个新手承认自己是菜鸡有多么容易
如果用一个辅助数组去做,肯定是可以做出来的,最后只要再移动到nums1中,但这肯定不是这道题的原意啊,不然和第21题有什么区别?
所以我一开始想的用nums2[0]和nums1比较,这样可以把较大的移出去,保存在nums2中。如下:
class Solution
{
public:
void merge(vector<int> &nums1, int m, vector<int> &nums2, int n)
{
int temp,count_1 = 0,count_2=0;
if(n<=0)
return;
while (count_1 < m)
{
if (nums1[count_1] > nums2[0])
{
temp = nums1[count_1];
nums1[count_1] = nums2[0];
nums2[0] = temp;
}
count_1++;
}
while(count_1<n+m)
{
nums1[count_1]=nums2[count_2];
count_2++;count_1++;
}
}
};
但是没想到万一nums1的数据普通比nums2比较大怎么办?一提交就错了,之后又想了把较大的移动到最后的,三个比较等等……都失败了,(吐槽下自己,这里都想到放到后面了,怎么没想到从后面开始放呢?惯性思维啊……果然算法是个极费脑子的活)
所以看了题解后才明白,我曹,太强了
class Solution
{
public:
void merge(vector<int> &nums1, int m, vector<int> &nums2, int n)
{
int num = n + m - 1;
n--;
m--;
if (n < 0)
return;
while (n >= 0 & m >= 0)
{
if (nums1[m] > nums2[n])
nums1[num--] = nums1[m--];
else
nums1[num--] = nums2[n--];
}
while (n >= 0)
nums1[num--] = nums2[n--];
//这里也可以合并到上个循环里,用num控制
}
};
当然评论里用api做的话,没什么意思了……