简单leetcode题目(数组)

前言

还是针对于基础算法,我们来利用图解来写几个leetcode题目,好好看,会有收获

本次博客从暴力求解到优化代码都会有,希望有所帮助吧

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 

88. 合并两个有序数组 - 力扣(LeetCode)

题目在链接这里

暴力思路

把第二个数组元素放到第一个数组中再进行排序

时间复杂度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--];
    }
}

看通过图

总结

今天太累了,就写一题吧

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值