经典LeetCode在线OJ习题

这篇具有很好参考价值的文章主要介绍了经典LeetCode在线OJ习题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

习题一:移除元素

(一)、题目

 (二)、示例

(三)、解题思路

思路一:

思路一源代码:

源代码解释:

思路二:(最标准最适用)

思路二源代码:

源代码解释:

 习题二:归并两个有序数组

(一)、题目

 (二)、示例

(三)、解题思路

 思路一:暴力求解但效率堪忧

思路二:

思路二步骤示意图:

思路二源代码:

源代码解释:


习题一:移除元素

(一)、题目

经典LeetCode在线OJ习题,LeetCode,leetcode,算法,c语言

 (二)、示例

经典LeetCode在线OJ习题,LeetCode,leetcode,算法,c语言

(三)、解题思路

该题小编一共给出两种思路:

思路一:

从最后一个元素开始从尾到始遍历数组,若找到val值,就与最后一个数交换,同时数组长度减1,第二次找到val值,就与倒数第二个数交换,以此类推,直到遍历完数组。

思路一源代码:
int removeElement(int* nums, int numsSize, int val)
{
	int i = 0;
	int j = numsSize - 1;
	int k = numsSize - 1;
	for (i = j; i >= 0; i--)
	{
		if (nums[i] == val)
		{
			int tmp = nums[i];
			nums[i] = nums[j];
			nums[j] = nums[i];
			j--;
			numsSize--;
		}
	}
	return numsSize;
}
源代码解释:

①:因为是力扣在线OJ,所以我们只需完成该函数部分,其中函数参数中:

nums为该数组首地址。

numsSize为该数组大小。

val为要删除的值。

②:最后返回numsSize是因为力扣系统会根据你返回的数组大小遍历一次数组,看是否删除元素val值。

③:首先我们根据思路将两个变量赋值相应的值,整型数组末尾元素的下标即为数组大小减一。

④:然后用一个for循环遍历数组,用if判断语句来判断该值是否等于val值,若等于,则与最后一个元素交换值,然后数组大小numsSize-1,最后遍历完数组,返回numsSize即可。

思路二:(最标准最适用)

用两个变量来控制下标:一个变量str用于遍历数组,进行判断是否等于val值;另一个变量dst用于存储值,当str下标对应的值不等于val值时,就将str下标对应的值赋值给dst下标对应的位置,然后dst++,最后dst就为新数组的大小,返回dst即可。

思路二源代码:
int removeElement(int* nums, int numsSize, int val) {
    int str = 0, dst = 0;
    while (str < numsSize)
    {
        if (nums[str] != val)
        {
            nums[dst++] = nums[str++];
        }
        else
        {
            str++;
        }
    }
    return dst;
}
源代码解释:

①:先创建两个变量用于控制下标,然后用一个while循环遍历数组,又因为numsSize不会变,str会依次++,所以循环条件为(str<numsSize)。

②:每一次循环都判断一次str下标对应的值是否等于val值,若不等于,则将str下标对应的值赋给dst下标对应的位置,然后str和dst都++一次;若等于val值,则str++一次判断下一次的值。

③:当遍历完数组后,dst即为新数组大小,最后返回dst即可。

经典LeetCode在线OJ习题,LeetCode,leetcode,算法,c语言经典LeetCode在线OJ习题,LeetCode,leetcode,算法,c语言经典LeetCode在线OJ习题,LeetCode,leetcode,算法,c语言

 

 习题二:归并两个有序数组

(一)、题目

经典LeetCode在线OJ习题,LeetCode,leetcode,算法,c语言

 注意:非递减和递增的区别:

经典LeetCode在线OJ习题,LeetCode,leetcode,算法,c语言

 (二)、示例

经典LeetCode在线OJ习题,LeetCode,leetcode,算法,c语言 

经典LeetCode在线OJ习题,LeetCode,leetcode,算法,c语言

经典LeetCode在线OJ习题,LeetCode,leetcode,算法,c语言

 

注意:我们看到示例1中,数组nums1 只有三个数,但却有六个空间,而数组nums2有三个数,恰好对应nums1剩余三个空间,所以这道题是说归并后全部放在数组nums1中,这就是此题难点。

(三)、解题思路

 思路一:暴力求解但效率堪忧

直接将两个数组拷贝在一起,再用qsort库函数排序即可,关于qsort的使用方法可参考http://t.csdn.cn/ThBhB

但这种方法不论是时间复杂度还是空间复杂度,效率都很低。

思路二:

将两数组从有效数字末尾处最大的数依次拿出来进行比较(为什么说是有效数字呐,因为题设要求是将数组nums1和数组nums2归并到数组nums1里面,所以nums1是有较大空间的,开始时,数组nums1除了自身待归并数组部分,剩下一部分全初始化为0,0也是数字,所以我们说需要从待排序数组的末尾处进行比较(即有效数字)),将较大的数从数组nums1末尾依次开始存放,所以两个数组都是非递减数组,所以按照此思路归并的数组也是一个非递减数组。

什么时候结束呐?根据这种思路,因为nums1是大空间,若当nums2里面的数比较完后,则全部结束;若nums1里面的数先比较完,nums2里面还有数没有比较,这时就需要将nums2里面的数放在nums1对应位置后才能全部结束。

思路二步骤示意图:

经典LeetCode在线OJ习题,LeetCode,leetcode,算法,c语言

 

经典LeetCode在线OJ习题,LeetCode,leetcode,算法,c语言 

 经典LeetCode在线OJ习题,LeetCode,leetcode,算法,c语言

 经典LeetCode在线OJ习题,LeetCode,leetcode,算法,c语言

经典LeetCode在线OJ习题,LeetCode,leetcode,算法,c语言 

思路二源代码:
void merge(int* nums1, int m, int* nums2, int n)
{
    int end = m + n - 1;
    int end1 = m - 1, end2 = n - 1;
    while (end1 >= 0 && end2 >= 0)
    {
        if (nums1[end1] > nums2[end2])
        {
            nums1[end--] = nums1[end1--];
        }
        else
        {
            nums1[end--] = nums2[end2--];
        }
    }
    while (end2 >= 0)
    {
        nums1[end--] = nums2[end2--];
    }
}
源代码解释:

①:因为这是力扣在线OJ习题,所以我们只需完成函数体部分,并且函数参数中:

nums1为数组一的首地址(大数组);

m为数组nums1的有效元素个数;

nums2为数组二的首地址;

n为数组nums2的元素个数;

②:根据步骤示意图,我们给出三个变量,分别找到end、end1、end2的起始位置,end即两数组的有效元素个数-1,end1为m-1,end2为n-1。

③:用while循环来依次拿出数据进行比较,并且如果end1和end2大于等于0时,说明两个数组中都还有元素没有进行比较归并,比较时,end1和end2下标谁对应的数比较大,就将该数放在nums1数组以end为下标的位置处,然后相应变量进行减减,进行下一组数的比较。

④:当且仅当end1或end2小于0时,while循环结束,即某一个数组的元素已经归并完了,这时又要分情况进行:

若end2<0,即数组nums2的元素已经归并完,这时虽然数组num1中还有元素未进行比较归并操作,但我们本来就是需要将所有的数归并到数组nums1,所以当数组nums2中的元素归并完成,数组nums1中剩下的元素也是自动排序好的,所以这时程序结束;

若end1<0,即数组nums1的元素已经归并完了,这时数组nums2中还有元素未归并,而我们又需要将所有的数都归并到数组nums1,所以我们还需要将数组nums2中为排序的元素放入数组nums1的剩余位置,又因为两数组都是非递减的,所以我们只需依次存放就行,然后程序结束。

本次知识到此为止,希望对你有所帮助!文章来源地址https://www.toymoban.com/news/detail-691172.html

到了这里,关于经典LeetCode在线OJ习题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java面试题之LeetCode经典算法篇

    2024年01月25日
    浏览(37)
  • 2.如何选择go语言基础类型——Leetcode习题9

    目录 本篇前瞻 Leetcode习题9 题目描述 原题解析 代码编写 有符号整形 基本数据类型 整形 有符号整形 无符号整形 浮点型 布尔型 字符 本篇小结 下一篇预告 欢迎来go语言的基础篇,这里会帮你梳理一下go语言的基本类型,注意本篇有参考go圣经,如果你有完整学习的需求可以看

    2024年02月12日
    浏览(36)
  • 3.你所不知道的go语言控制语句——Leetcode习题69

    目录 本篇前瞻 Leetcode习题9 题目描述 代码编写 控制结构 顺序结构(Sequence) 声明和赋值 多返回值赋值 运算符 算术运算符 位运算符 逻辑运算 分支结构 if 语句 switch 语句 逻辑表达式 fallthrough 类型推断 循环语句 continue break goto Leetcode习题69 题目描述 题目分析 代码编写 本篇

    2024年02月12日
    浏览(28)
  • 算法修炼之路之双指针含多道leetcode 经典题目

    目录 前言  一:普通双指针 1.经典题目一  283移动0问题 分析 代码实现 2.经典题目二 1089复写0  分析 代码实现 二:解决成环类问题-快慢指针  经典例题一 202快乐数 分析  代码实现   三:左右相遇指针 经典例题一 11 盛最多水的容器 分析  代码实现    接下来的日子会顺

    2024年04月13日
    浏览(63)
  • 【经典LeetCode算法题目专栏分类】【第5期】贪心算法:分发饼干、跳跃游戏、模拟行走机器人

    《博主简介》 小伙伴们好,我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌ 更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍 感谢小伙伴 们点赞、关注! class   Solution :      def   findContentChildren ( self ,  g :  List [ int ],  s

    2024年02月04日
    浏览(42)
  • python - leetcode - 424. 替换后的最长重复字符【经典题解 - 贪心滑动窗口算法】

    描述: 给你一个字符串 s 和一个整数 k 。你可以选择字符串中的任一字符,并将其更改为任何其他大写英文字符。该操作最多可执行 k 次。 在执行上述操作后,返回包含相同字母的最长子字符串的长度。 示例 1: 示例 2: 提示: 1 = s.length = 105 s 仅由大写英文字母组成 0 =

    2024年02月16日
    浏览(36)
  • 【数据结构】回溯算法公式化解题 leetcode经典题目带刷:全排列、组合、子集

    一、什么是回溯算法 回溯算法(Backtracking Algorithm)是一种解决 组合问题 、 排列问题 、 选择问题 等一类问题的常用算法。它通过尝试所有可能的选择来找到问题的解,当发现当前选择不符合要求时,就回溯到之前的状态,然后尝试其他的选择。 1、基本思想: 从问题的起

    2024年02月11日
    浏览(34)
  • 【数据结构】 算法的时间复杂度和空间复杂度 (上)(附leetcode练习题)

    ☃️个人主页:fighting小泽 🌸作者简介:目前正在学习C语言和数据结构 🌼博客专栏:数据结构 🏵️欢迎关注:评论👊🏻点赞👍🏻留言💪🏻 如何衡量一个算法的好坏呢?比如对于以下斐波那契数列: 斐波那契数列的递归实现方式非常简洁,但简洁一定好吗?那该如何

    2023年04月14日
    浏览(27)
  • 【数据结构】算法的时间复杂度和空间复杂度 (上)(附leetcode练习题)

    ☃️个人主页:fighting小泽 🌸作者简介:目前正在学习C语言和数据结构 🌼博客专栏:数据结构 🏵️欢迎关注:评论👊🏻点赞👍🏻留言💪🏻 如何衡量一个算法的好坏呢?比如对于以下斐波那契数列: 斐波那契数列的递归实现方式非常简洁,但简洁一定好吗?那该如何

    2023年04月22日
    浏览(52)
  • 【数据结构】算法的时间复杂度和空间复杂度(下)(附leetcode练习题)

    ☃️个人主页:fighting小泽 🌸作者简介:目前正在学习C语言和数据结构 🌼博客专栏:数据结构 🏵️欢迎关注:评论👊🏻点赞👍🏻留言💪🏻 空间复杂度也是一个数学表达式,是对一个算法在运行过程中 临时占用的额外的存储空间大小的量度 。 空间复杂度不是程序占用

    2023年04月19日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包