前言
还是针对于基础算法,我们来利用图解来写几个leetcode题目,好好看,会有收获
本次博客从暴力求解到优化代码都会有,希望有所帮助吧
给你两个按 非递减顺序 排列的整数数组 nums1
和 nums2
,另有两个整数 m
和 n
,分别表示 nums1
和 nums2
中的元素数目。
请你 合并 nums2
到 nums1
中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1
中。为了应对这种情况,nums1
的初始长度为 m + n
,其中前 m
个元素表示应合并的元素,后 n
个元素为 0
,应忽略。nums2
的长度为 n
题目在链接这里
暴力思路
把第二个数组元素放到第一个数组中再进行排序
时间复杂度n*logn 空间复杂度o(1)
看代码
#include<iostream>
#include<algorithm>
using namespace std;
#define a 5
#define b 6
int main()
{
int arr[a+b] = { 1,2,3,4,5,0,0,0,0,0,0};
int brr[b] = { 2,3,4,5,6,7 };
for (int i = a, j = 0; i < a + b; i++, j++)
arr[i] = brr[j];
sort(arr, arr + a + b);//排序函数
for (int i = 0; i < a + b; i++)
printf("%d ", arr[i]);
return 0;
}
优化1 牺牲空间换取时间
可以使用两个指针让他们比较大小存入一个新的数组中
时间复杂度 max(a,b) 其实就是o(n),空间复杂度o(n)
看代码
#include<iostream>
#include<algorithm>
using namespace std;
#define a 5
#define b 6
int main()
{
int arr[a+b] = { 1,2,3,4,5,0,0,0,0,0,0};
int brr[b] = { 2,3,4,5,6,7 };
int crr[a + b] = { 0 };
int pa = 0;
int pb = 0;
int i = 0;
while (pa < a && pb < b)
{
if (arr[pa] < brr[pb])crr[i++] = arr[pa++];
else crr[i++] = brr[pb++];
}
if (pa == a)
while (pb<b)
crr[i++] = brr[pb++];
else
while (pb == b)
crr[i++] = arr[pa++];
for (int i = 0; i < a + b; i++)
printf("%d ", crr[i]);
return 0;
}
最终优化
思路
使用双指针思路,用三个指针,分别指向第一个数组的最后一个元素
第二个数组的最后一个元素,以及最大数组的最后一个元素
从后往前遍历
我们还是画图理解
看代码
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
int a=m-1;
int b=n-1;
int c=nums1Size-1;
while(a>=0&&b>=0)
{
if(nums1[a]>nums2[b])
{
nums1[c--]=nums1[a--];
}
else
nums1[c--]=nums2[b--];
}
if(b>=0)
{
while(b>=0)
nums1[c--]=nums2[b--];
}
}
看通过图
总结
今天太累了,就写一题吧