Every day a leetcode
题目来源:88. 合并两个有序数组
解法1:排序
将nums2拼接到nums1的末尾,再对nums1排序,即为答案。
代码:
C版本:
int cmpfunc (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
for(int i=0;i<n;i++) nums1[m+i]=nums2[i];
qsort(nums1,nums1Size,sizeof(int),cmpfunc);
}
C++版本(2023.6.5更新):
/*
* @lc app=leetcode.cn id=88 lang=cpp
*
* [88] 合并两个有序数组
*/
// @lc code=start
class Solution
{
public:
void merge(vector<int> &nums1, int m, vector<int> &nums2, int n)
{
for (int i = 0; i < n; i++)
nums1[m + i] = nums2[i];
sort(nums1.begin(), nums1.end());
}
};
// @lc code=end
结果:
解法2:双指针+辅助空间
使用两个指针分别指示nums1,nums2。
使用一个额外数组空间数组存储排序结果,最后复制回nums1。
代码:
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
int p=0;
int q=0;
int cur;
int sort_nums[m+n];
while (p<m || q<n)
{
if (p == m) cur=nums2[q++];
else if(q == n) cur=nums1[p++];
else if(nums1[p]<nums2[q]) cur=nums2[q++];
else cur=nums2[p++];
sort_nums[p+q-1]=cur;
}
for(int i=0;i<m+n;i++)
{
nums1[i]=sort_nums[i];
}
}
结果:
解法3:逆向双指针
定义两个指针,指向2个数组,指针设置为从后向前遍历,每次取两者之中的较大者放进nums1的最后面。
代码:
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
int p=m-1;
int q=n-1;
int tail=m+n-1;
int cur;
while(p>=0 || q>=0)
{
if(p == -1) cur=nums2[q--];
else if(q == -1) cur=nums1[p--];
else if(nums1[p]>=nums2[q]) cur=nums1[p--];
else cur=nums2[q--];
nums1[tail--]=cur;
}
}
C++版本(2023.6.5更新):
/*
* @lc app=leetcode.cn id=88 lang=cpp
*
* [88] 合并两个有序数组
*/
// @lc code=start
// class Solution
// {
// public:
// void merge(vector<int> &nums1, int m, vector<int> &nums2, int n)
// {
// for (int i = 0; i < n; i++)
// nums1[m + i] = nums2[i];
// sort(nums1.begin(), nums1.end());
// }
// };
class Solution
{
public:
void merge(vector<int> &nums1, int m, vector<int> &nums2, int n)
{
int pos = m-- + n-- - 1;
while (m >= 0 && n >= 0)
{
nums1[pos--] = nums1[m] > nums2[n] ? nums1[m--] : nums2[n--];
}
while (n >= 0)
{
nums1[pos--] = nums2[n--];
}
}
};
// @lc code=end
结果: