【LeetCode刷题篇零】一些基础算法知识和前置技能(上)

这篇具有很好参考价值的文章主要介绍了【LeetCode刷题篇零】一些基础算法知识和前置技能(上)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

排序算法

O(N^2)的排序算法:冒泡、选择、插入

冒泡排序

【LeetCode刷题篇零】一些基础算法知识和前置技能(上),LeetCode刷题笔记,leetcode,算法,数据结构

冒泡的核心是两两比较,大数下沉,小数上浮,比较的轮数是数组的长度 N,每一轮比较的次数为 N - 当前轮的索引:

  • 外层循环控制轮数 round: [1,N]
  • 内层循环控制次数 i: [0,N - round)

在每一轮当中,内循环中两两比较相邻的两个数,大数下沉(交换),如果某一轮没有发生交换操作,则可以提前终止。

代码如下:

【LeetCode刷题篇零】一些基础算法知识和前置技能(上),LeetCode刷题笔记,leetcode,算法,数据结构

冒泡排序的特点:

  • 时间复杂度是 O(N^2)
  • 空间复杂度是 O(1),是原地排序算法
  • 冒泡排序是稳定的排序算法

这里的稳定是因为相等的元素不会做交换操作

【LeetCode刷题篇零】一些基础算法知识和前置技能(上),LeetCode刷题笔记,leetcode,算法,数据结构

选择排序

选择排序的做法是首先从剩余元素中选择一个最小的数与未排序的第一个元素进行交换:

【LeetCode刷题篇零】一些基础算法知识和前置技能(上),LeetCode刷题笔记,leetcode,算法,数据结构

接着再从剩余元素中选择一个最小的元素进行交换:

【LeetCode刷题篇零】一些基础算法知识和前置技能(上),LeetCode刷题笔记,leetcode,算法,数据结构

  • 外层循环 i: [0,N)
  • 内层循环 j: [i+1, N)

设当前 i 位置值为最小值,内层循环找到最小的数,记住下标,跟当前 i 位置进行交换。

代码如下:

【LeetCode刷题篇零】一些基础算法知识和前置技能(上),LeetCode刷题笔记,leetcode,算法,数据结构

选择排序的特点:

  • 时间复杂度是 O(N^2)
  • 空间复杂度是 O(1),是原地排序算法
  • 选择排序是不稳定的排序算法

插入排序

每次从数组的无序区间中取一个元素插入到有序的区间中:

【LeetCode刷题篇零】一些基础算法知识和前置技能(上),LeetCode刷题笔记,leetcode,算法,数据结构

  • 外层循环 i: [1,N)
  • 内层循环 j: [i,0)

内层循环中将当前元素跟前一个元素比较,如果比前一个小就交换,否则结束内层循环。

代码如下:

【LeetCode刷题篇零】一些基础算法知识和前置技能(上),LeetCode刷题笔记,leetcode,算法,数据结构

这个代码还可以继续优化一下,我们可以先记住待插入的元素,然后让 ji 位置往前寻找到合适的位置再插入。在寻找的过程中直接将前面的元素往后面位置覆盖,因为我们记住了一个元素,相当于留出了一个坑位,因此可以前面的元素依次往后挪一个位置,直到找到可插入位置为止。

【LeetCode刷题篇零】一些基础算法知识和前置技能(上),LeetCode刷题笔记,leetcode,算法,数据结构
【LeetCode刷题篇零】一些基础算法知识和前置技能(上),LeetCode刷题笔记,leetcode,算法,数据结构

外层先记住当前的 i 位置的值 tmp,内层每次看 j - 1 位置的数,如果比tmp大的就直接将 j - 1 位置覆盖到 j 位置,如果比tmp小,就结束内层循环,将tmp覆盖到 j 位置。

优化后的代码如下:

【LeetCode刷题篇零】一些基础算法知识和前置技能(上),LeetCode刷题笔记,leetcode,算法,数据结构

这个代码省略了交换操作,做到了原地交换

插入排序的特点:

  • 时间复杂度是 O(N^2)
  • 空间复杂度是 O(1),是原地排序算法
  • 插入排序是稳定的排序算法

O(N^2) 的排序算法性能比较:插入排序 > 选择排序 > 冒泡排序,插入排序性能最好,冒泡排序性能最差。

但是在LeetCode刷题的过程中,很少会用到O(N^2) 的排序算法,因为效率比较低,作为了解即可。

希尔排序

希尔排序的核心思想是先使部分有序,最后让整体有序。

【LeetCode刷题篇零】一些基础算法知识和前置技能(上),LeetCode刷题笔记,leetcode,算法,数据结构
【LeetCode刷题篇零】一些基础算法知识和前置技能(上),LeetCode刷题笔记,leetcode,算法,数据结构
【LeetCode刷题篇零】一些基础算法知识和前置技能(上),LeetCode刷题笔记,leetcode,算法,数据结构

这里递增序列也叫做步长,步长的计算公式有很多种,参见下表:

【LeetCode刷题篇零】一些基础算法知识和前置技能(上),LeetCode刷题笔记,leetcode,算法,数据结构

其中 k=1,2,3,4,5,6…N是数组长度。下面是选择步长公式为 (3^k - 1) / 2 的参考代码:

【LeetCode刷题篇零】一些基础算法知识和前置技能(上),LeetCode刷题笔记,leetcode,算法,数据结构

希尔排序的特点:

  • 空间复杂度是 O(1),是原地排序算法
  • 希尔排序是不稳定的排序算法

希尔排序的时间复杂度跟所选择的步长计算公式有关:

【LeetCode刷题篇零】一些基础算法知识和前置技能(上),LeetCode刷题笔记,leetcode,算法,数据结构

选择步长公式为 (3^k - 1) / 2 的时间复杂度是 O(n^3/2),而选择其他步长公式最差可以是 O(n^2)

在大规模乱序数组情况下,希尔排序优于插入排序。

O(NlogN)的排序算法:快排、 归并

快速排序

快排核心思想:选择数组中任一个数字作为分区点,小的放左边,大的放右边

【LeetCode刷题篇零】一些基础算法知识和前置技能(上),LeetCode刷题笔记,leetcode,算法,数据结构
【LeetCode刷题篇零】一些基础算法知识和前置技能(上),LeetCode刷题笔记,leetcode,算法,数据结构

快排按照分区点的选择方式不同,我整理的有两种版本的代码:

第一种:以最右边的元素作为分区点的分区逻辑(快慢指针)文章来源地址https://www.toymoban.com/news/detail-733135.html

到了这里,关于【LeetCode刷题篇零】一些基础算法知识和前置技能(上)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 机器学习、cv、nlp的一些前置知识

    为节省篇幅,不标注文章来源和文章的问题场景。大部分是我的通俗理解。 多元函数的二阶偏导数构成的方阵,对称。 随机变量是样本点的函数。 一个例子是,平面上的每一个点都是一个随机变量。 随机场强调空间,跟随机过程一样,都是一系列随机变量的集合。 阶乘在

    2024年02月12日
    浏览(32)
  • 数据结构刷题篇 之 【力扣二叉树基础OJ】详细讲解(含每道题链接及递归图解)

    有没有一起拼用银行卡的,取钱的时候我用,存钱的时候你用 难度等级:⭐ 直达链接:相同的树 难度等级:⭐ 直达链接:单值二叉树 难度等级:⭐⭐ 直达链接:对称二叉树 难度等级:⭐⭐⭐ 直达链接:二叉树的前序遍历 难度等级:⭐⭐⭐⭐ 直达链接:另一颗子树 注:

    2024年04月16日
    浏览(78)
  • LeetCode 刷题记录——从零开始记录自己一些不会的

    1. 最多可以摧毁的敌人城堡数目 题意 思路 两层循环,太low了 用一个变量记录前一个位置 代码 2. 到达终点的数字 题意 思路 代码 3. 单词的压缩编码 题意 思路 代码 思路2 去找到是否不同的单词具有相同的后缀,我们可以将其反序之后插入字典树中。例如,我们有 “time”

    2024年02月09日
    浏览(63)
  • 蓝桥杯刷题篇①

    前言:hello各位童学们好呀!许久不见!本文为本人的蓝桥杯OJ的刷题笔记!文章隶属于专栏蓝桥杯,该专栏的目的是为了记录自己的刷题记录和学习过程,激励自己不断前行,为明年的ACM、ICPC、蓝桥杯等比赛做足准备,也希望可以帮助到一些同样在刷题道路上的小伙伴们!

    2024年02月09日
    浏览(51)
  • 【刷题篇】链表(上)

    前段时间我们学习了单向链表和双向链表,本期将带来3道与链表相关的OJ题来巩固对链表的理解。话不多说,让我们进入今天的题目吧! 🚀本期的题目有: 反转单链表 、 链表的中间结点 、 合并两个有序链表 a.题目 b.题解分析(迭代) 🍡 三指针法: 我们可以直接在原链表的

    2024年02月02日
    浏览(53)
  • 【刷题篇】栈和队列

    目录 一.前言🌈 二.有效的括号✨ a.题目 b.题解分析 c.AC代码  三. 用队列实现栈📏 a.题目 b.题解分析(辅助队列法) c.AC代码(辅助队列法) d.题解分析(就地存储法) c.AC代码(就地存储法) 四. 用栈实现队列🍀 a.题目 b.题解分析 c.AC代码         各位小友们好久不见,甚

    2024年02月02日
    浏览(45)
  • 【刷题篇】链表(下)

    各位读者们好,本期我们来填填之前留下的坑,继续来讲解几道和链表相关的OJ题。但和上期单向链表不一样的是,我们今天的题目主要是于环形链表有关,下面让我们一起看看吧。 💻本期的题目有: 环形链表 、 环形链表II 、 求环形链表环长 a.题目 b.题解分析 第一种方法

    2024年01月25日
    浏览(42)
  • 分享刷题的一些小知识点--4.9日

    1.string库提供了 、、==、=、=、!= 等比较运算符,比如两个字符串s和t,直接(s==t)是正确的。 2.unordered_map 容器,直译过来就是\\\"无序 map 容器\\\"的意思。所谓“无序”,指的是 unordered_map 容器不会像 map 容器那样对存储的数据进行排序。换句话说,unordered_map 容器和 map 容器仅有

    2023年04月11日
    浏览(44)
  • 【刷题篇】抽牌获胜的概率

    谷歌面试题 将面值1-N的牌组成一组 每次从组中等概率的抽出1-N中的一张 下次抽会换一个新的组,有无限组 当抽到的牌累加和a时,将一直抽牌 当累加和=a且b时,你将获胜 当累加和=b时,你将失败 给定的参数N,a,b 返回获胜的概率 核心思想 优化递归函数中的for循环, 因为计算

    2024年02月06日
    浏览(37)
  • 力扣刷题篇之《空白替换》

    ❤️ 铁汁们大家好,欢迎大家来到出小月的博客里,今天小月呢写了一道题目叫替换空格,但是呢,写完之后调试了半天不知道哪里错了,经过小月的坚持不懈,终于成功,来分享给大家小月的错误,希望大家看完我这篇文章都能够“涨芝士”,感觉小月写的还不错的话,记

    2023年04月26日
    浏览(81)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包