The task is: here
i've successfuly got working code on local machine, also on platform first three casess attempted my solution. But if i run Submit i've get the undefined behavior runtime error on this case: nums1 = [2,0], m = 1, nums2 = [1], n = 1. As i understand in result must be nums1 = [1,2] and i've get it in local machine without any errors. why that happen?
class Solution {
public:
void merge(std::vector<int>& nums1, int m, std::vector<int>& nums2, int n);
};
void Solution::merge(std::vector<int>& nums1, int m, std::vector<int>& nums2, int n)
{
int iNums1 = m - 1;
int iNums2 = n - 1;
int iResult = m + n - 1;
for (; iResult >= 0 && iNums2 >= 0; iResult--)
{
if (iNums2 < 0)
{
break;;
}
else if (iNums1 < 0 && iNums2 >= 0)
{
std::swap(nums2, nums1);
break;
}
else if (nums2[iNums2] > nums1[iNums1])
{
nums1[iResult] = nums2[iNums2--];
}
else if (iResult <= m && nums1[iResult - 1] <= nums2[iNums2] && nums1[iResult] > nums2[iNums2])
{
nums1[iResult + 1] = nums1[iResult];
nums1[iResult] = nums2[iNums2--];
}
}
}
used testcase on local machine, no errors occured:
Solution s;
std::vector<int> nums1 = { 2, 0 };
std::vector<int> nums2 = { 1 };
std::vector<int> result = { 1, 2 };
s.merge(nums1, 1, nums2, 1);
Best solution is to use std::merge
and merge things in reversed order (note r
suffix for iterator functions).
This way merge can be done in place without overriding the input data.
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
std::merge(
nums1.rbegin() + nums1.size() - m, nums1.rend(),
nums2.rbegin() + nums2.size() - n, nums2.rend(),
nums1.rbegin(),
std::greater<>{});
}
};