自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(189)
  • 收藏
  • 关注

原创 排序算法乱炖: 快速排序、归并排序、冒泡排序

分别指向这两个列表的起始元素,申请内存空间新建一个空列表,比较两个指针指向的元素大小,将较小的元素添加到新列表中,然后将该指针向该列表的下一个元素偏移,继续比较两个指针指向的元素和添加较小的到新列表中。直到其中一个列表的数据全部被添加完时,把另一个列表中剩下的数据按顺序添加到新列表中。:用两层for循环,每一次外循环都可以把无序中最小的元素放到有序元素的最开始。:nlogn,logn为递归的层数,n为每层递归中总的时间复杂度。:nlogn,logn为递归的层数,n为每层递归中总的时间复杂度。

2023-06-27 13:35:04 612

原创 从源头理解Batch Normalization (顺带搞懂为什么做参数初始化)

基于第一节讲到的Normalization能为神经网络带来的种种好处,面临的下一个问题就是针对不同的任务,网络每一层的多维的数据在哪个维度进行Normalization是最合适的,于是就有了Batch Normalization(BN)。:因为理想输出y是做了Normalization的高斯分布(均值为0方差为1),所以参数初始化的目标就是使得输入x经过k和b的一通计算后,预测的输出y仍然服从Normalization的正态分布(均值为0方差为1),能满足这个条件的参数k和b,就是一个好的初始化!

2023-02-18 10:14:22 816 1

原创 【搜索和回溯】剑指 Offer 28. 对称的二叉树

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。输入:root = [1,2,2,3,4,4,3]: 运用DFS遍历(递归)求解。

2023-02-12 18:09:49 245

原创 【搜索和回溯】剑指 Offer 27. 二叉树的镜像

根据二叉树镜像的定义就是交换左子树和右子树,运用DFS遍历(先序遍历)二叉树,交换每个节点的左 / 右子节点,即可生成二叉树的镜像。利用辅助栈(或队列),按照层序,遍历树的所有节点node,并交换每个node的左/右子节点。:请完成一个函数,输入一个二叉树,该函数输出它的镜像。:输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]

2023-02-12 17:45:53 138

原创 【搜索(指图和树的搜索)和回溯】剑指 Offer 26. 树的子结构

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。输入:A = [1,2,3], B = [3,1]:DFS前序遍历+普通递归结构,参考。

2023-02-12 17:12:49 95

原创 【搜索(BFS)】剑指 Offer 32 - III. 从上到下打印二叉树 III

请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。:用BFS + for循环加入当前层的所有元素+加入个奇偶层判断。

2023-02-11 18:20:30 95

原创 【搜索(BFS)】剑指 Offer 32 - II. 从上到下打印二叉树 II

卡点是如何去分辨当前节点在哪一层,利用for循环,因为在while循环的每一次中,当前queue的长度总是当前层的长度,所以用for循环把结果加入进临时列表就行,这样每次临时列表存的元素刚好就是每一层的所有节点。从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。

2023-02-11 18:04:47 90

原创 【搜索(BFS)】剑指 Offer 32 - I. 从上到下打印二叉树

从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。:此题是典型的BFS,故直接用模板即可。队列+while queue。

2023-02-11 17:26:50 87

原创 【查找算法(二分查找)】剑指 Offer 50. 第一个只出现一次的字符

在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。s 只包含小写字母。:运用哈希表来解决,哈希集合解决不了。输入:s = “abaccdeff”

2023-02-08 16:33:00 99

原创 【查找算法】剑指 Offer 11. 旋转数组的最小数字

给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。然后如何用套用二分法呢?注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入:numbers = [3,4,5,1,2]

2023-02-08 16:05:00 86

原创 【查找算法】剑指 Offer 04. 二维数组中的查找

在一个 n * m 的二维数组中,每一行都按照从左到右 非递减 的顺序排序,每一列都按照从上到下 非递减 的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。:若使用暴力法遍历矩阵 matrix ,则时间复杂度为 O(NM)。暴力法未利用矩阵 “从上到下递增、从左到右递增” 的特点,显然不是最优解法。给定 target = 20,返回 false。给定 target = 5,返回 true。

2023-02-08 14:04:51 93

原创 【查找算法】剑指 Offer 53 - II. 0~n-1中缺失的数字

一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。:排序数组中的搜索问题,首先想到 二分法 解决。输入: [0,1,2,3,4,5,6,7,9]

2023-02-07 15:16:09 79

原创 【查找算法】剑指 Offer 53 - I. 在排序数组中查找数字 I

排序数组中的搜索问题,优先想到二分查找法解决!要注意边界条件:数组中可能根本就没target。输入: nums = [5,7,7,8,8,10], target = 8。统计一个数字在排序数组中出现的次数。

2023-02-07 14:34:40 86

原创 【查找算法(二分查找)】剑指 Offer 03. 数组中重复的数字

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。题解2:用哈希集合,遍历一遍数组,如果集合里没有这个元素则加入集合,后续的遍历中,如果集合里有了这个元素,则说明重复了,返回即可。找出数组中重复的数字。

2023-02-07 13:31:41 105

原创 【字符串】剑指 Offer 58 - II. 左旋转字符串

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。:字符串为不可变对象。要知道的是字符串也可以用下标进行访问!输入: s = “abcdefg”, k = 2。:字符串也可以用下标进行访问!输出: “cdefgab”

2023-02-06 12:46:43 99

原创 【字符串】剑指 Offer 05. 替换空格

在 Python 和 Java 等语言中,字符串都被设计成「不可变」的类型,即无法直接修改字符串的某一位字符,需要新建一个字符串实现。而且注意的是,我们不能通过循环变量修改变量的值。请实现一个函数,把字符串 s 中的每个空格替换成"%20"。用列表来作为result,最后转化为字符串并返回的方法。输入:s = “We are happy.”输出:“We%20are%20happy.”

2023-02-06 12:27:34 108

原创 【链表和数组】剑指 Offer 35. 复杂链表的复制

难点在于如果用dummy head(dummy也等同于pre)的话,pre.random不知道该如何定义。所以我们利用哈希表的查询特点(哈希表搜索快),考虑构建 原链表节点 和 新链表对应节点 的键值对映射关系,再遍历构建新链表各节点的 next 和 random 引用指向即可。请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。

2023-02-05 12:01:38 82

原创 【数组与链表】剑指 Offer 06. 从尾到头打印链表

根本不用反转链表,因为输出只要是数组的形式,所以利用栈先进后出的原理,创建一个辅助栈,就可以反转结果了。:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。:想麻烦了,先把链表反转了,然后再取值。输入:head = [1,3,2]输出:[2,3,1]

2023-02-05 11:23:32 86

原创 【栈与队列】剑指 Offer 30. 包含min函数的栈

由于返回最小值的时间复杂度要求是O(1),所以这里要用一个辅助栈来存储最小值。然后其余push函数和pop函数都是可以基于栈本身的操作(如append,pop)来写的。定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。--> 返回 -3.minStack.min();--> 返回 -2.

2023-02-04 15:20:51 82

原创 【栈与队列】剑指 Offer 09. 用两个栈实现队列

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ):卡点是应该只在delete时考虑把栈1的元素转移到栈2,在appendtail时只管append元素就行。输出:[null,null,3,-1,-1]

2023-02-04 14:18:28 95

原创 leetcode 210: 课程表 II

现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给你一个数组 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在选修课程 ai 前 必须 先选修 bi。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序为 [0,1]。例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示:[0,1]。输入:numCourses = 2, prerequisites = [[1,0]]

2023-02-03 13:42:20 157

原创 leetcode 207:课程表

在选修某些课程之前需要一些先修课程。先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi。):O(M+N),遍历一个图需要访问所有节点和所有临边,N和M 分别为节点数量和邻边数量;例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1。学习课程 1 之前,你需要完成课程 0。空间复杂度:O(M×N),为建立关系表的额外空间,N为节点数量,M为邻边数量。

2023-02-02 18:35:35 354

原创 leetcode 720. 词典中最长的单词

易错点是要谨记当前字符的flag标志是存储在它的孩子节点里即value这个字典中。给出一个字符串数组 words 组成的一本英语词典。返回 words 中最长的一个单词,该单词是由 words 词典中其他单词逐步添加一个字母组成。解释: 单词"world"可由"w", “wo”, “wor”, 和 "worl"逐步添加一个字母组成。输入:words = [“w”,“wo”,“wor”,“worl”, “world”]若其中有多个可行的答案,则返回答案中字典序最小的单词。若无答案,则返回空字符串。

2023-01-27 20:24:56 82

原创 leetcode 208. 实现 Trie (前缀树)

boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true;Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);

2023-01-27 19:01:26 640 1

原创 leetcode 221. 最大正方形

输入:matrix = [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“0”,“1”,“0”]]在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。:每一个dp[i][j]看做第i行第j列格子的右下角位置。

2023-01-17 14:15:56 56

原创 leetcode 279完全平方数

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。给你一个整数 n ,返回 和为 n 的完全平方数的最少数量。解释:12 = 4 + 4 + 4。

2023-01-16 20:22:22 41

原创 leetcode 70 爬楼梯

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?:找到重叠子问题,然后列状态方程,再分析边界条件。需要 n 阶你才能到达楼顶。解释:有两种方法可以爬到楼顶。

2023-01-15 14:19:38 62

原创 Leetcode 121买卖股票的最佳时机

股票问题的方法就是“”动态规划”,因为它包含了重叠子问题,即买卖股票的最佳时机是由之前买或不买的状态决定的,而之前买或不买又由更早的状态决定的。解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。空间复杂度:O(1),使用了有限的变量。

2023-01-05 15:52:34 384

原创 leetcode 62.不同路径

令m为行、n为列,相比优化1,少了pre数组,cur[j] += cur[j-1] 即 cur[j] = cur[j-1] + cur[j] 未赋值之前右边的cur[j] 始终表示当前行第i行的上一行第j列的值,赋值之后左边的cur[j]表示当前行第i行第j列的值,cur[j-1] 表示当前行第i行第j-1列的值(cur[j-1] 在计算cur[j]之前就已经计算了,所以表示的是当前行而不是上一行 ), 思路跟优化1是一样的,除了少用了一个数组。机器人每次只能向下或者向右移动一步。

2023-01-04 14:01:48 221

原创 PointNet++理解

3D检测里面有这样一类操作,用白话讲,可以归类为“路由”:即把特征从哪里取出来,或把特征汇聚到哪里去。“路由”的建立过程本身可以不可导(比如FPS和ball query)。但“路由”一旦建立,特征的传递和映射过程一般都是可导的。对于pointnet++中的一个例子(因为不能debug进用C++写的自定义的cuda算子,debug没法进c++的代码的,只能到调用的那一步,所以推荐直接采用全局搜索),对于前向传播中那些不能导的操作,是要重写一下backward函数的,重写时可能会调用自己实现的cuda代码。

2022-12-22 15:09:13 521

原创 leetcode 55. 跳跃游戏

方法就是设初始化最远位置为 0,然后遍历数组,如果当前位置能到达,并且当前位置+跳数>最远位置,就更新最远位置。解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。:贪心算法,尽可能到达最远位置(贪心),因为如果能到达某个位置,那么他前面的任意位置他都能到达。给定一个非负整数数组 nums ,你最初位于数组的 第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。:时间复杂度 O(n),空间复杂度O(1)。输入:nums = [2,3,1,1,4]

2022-12-20 20:22:10 125

原创 leetcode 1217. 玩筹码

用贪心算法的思想,分析题目后,发现偶数的位置到偶数位置需要用的代价为0,奇数到奇数同理,只有偶数到奇数或者奇数到偶数的移动才需要用掉1的cost。所以我们要想总代价最少,直接就求得偶数的总数和以及奇数的总数和,比较谁小,那么代价就是小的那一个值。position[i] + 1 或 position[i] - 1 ,此时 cost = 1。第 i 个筹码的位置是 position[i]。解释:第一步:将位置3的筹码移动到位置1,成本为0。第二步:将位置2的筹码移动到位置1,成本= 1。

2022-12-18 13:39:10 116

原创 leetcode 721. 账户合并

输入:accounts = [[“John”, “[email protected]”, “[email protected]”], [“John”, “[email protected]”], [“John”, “[email protected]”, “[email protected]”], [“Mary”, “[email protected]”]]现在,我们想合并这些账户。合并账户后,按以下格式返回账户:每个账户的第一个元素是名称,其余元素是 按字符 ASCII 顺序排列 的邮箱地址。

2022-12-16 16:13:55 476

原创 leetcode 46. 全排列

题解:运用回溯法,和之前回溯法有一点区别!关键地方在于从示例中可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题for循环就不用使用startIndex了,必须用0作为起始索引,需要额外定义一个状态变量!即需要一个used数组,标记已经选择的元素,然后在递归过程中遇到这个元素直接就continue跳过去。输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]:输入:nums = [1,2,3]

2022-12-02 14:49:47 278

原创 leetcode 77.组合

题解:此题和leetcode 78一样的思想,用长度来当做递归的结束条件,记得画递归图!还要注意一点是pop删元素时,是每退出一层都会删掉一个元素。所以在进入下一个for循环时,subset其实是以空列表的姿态进入。题目描述:给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。输入:n = 4, k = 2。

2022-12-01 14:38:06 395

原创 充分理解判别模型和生成模型、概率模型和非概率模型

在理解完上面的文章后再看这篇博文,你就能够理解这篇文章中的公式,然后对判别模型,生成模型,概率模型,非概率模型的都能有足够清晰的认识。首先看这篇文章:作者从最基础的视角引入并讲解了概率模型和非概率模型(最后看这个:作者通过一个实际案例带你更加深刻认识概率与非概率模型。

2022-11-26 15:34:52 457

原创 概率论及概率图模型基础

后验概率与条件概率区别:后验概率就是一种条件概率,但是与其它条件概率的不同之处在于,后验概率限定了目标事件为隐变量取值(广义上的隐变量主要就是指“不能被直接观察到,但是对系统的状态和能观察到的输出存在影响的一种东西”),而其中的条件为观测结果。一般的条件概率,条件和目标事件都可以是任意的,条件和目标事件是可以没有任何关系的。贝叶斯公式就是由先验概率求后验概率的公式举例区分普通条件概率与后验概率的区别:1)那么如果我们出门之前我们听到新闻说今天路上出了个交通事故,那么我们想算一下堵车的概率,这个就叫做条

2022-11-20 14:09:01 593

原创 编程语言和操作系统是什么关系?编程语言如何被计算机执行的?驱动程序的理解?

我们平常所提到的计算机的内存指的是动态内存(即DRAM),动态内存中所谓的“动态”,指的是当我们将数据写入DRAM后,经过一段时间,数据会丢失,因此需要一个额外设电路进行内存刷新操作。但时间一长,代表1的电容会放电,代表0的电容会吸收电荷,这就是数据丢失的原因。我们都知道,中间层是为了提供抽象转换而存在的,而这套叫做操作系统的中间层,定义了一套规则,使得后续的可执行程序能够更容易的被运行起来,而且能更容易的利用各种硬件(显示,键盘等等),能够调用一些库来消除不同的程序间重复的运行逻辑。

2022-11-13 17:32:51 2214

原创 使用pybind11为python开发扩展模块

比如使用pybind11可以封装一个c++类对应到python中。python的底层大都使用c++进行封装,可以利用c++的计算性能和python的便利性。: .pyd (Windows 平台) 或 .so (Linux 平台) 文件,才可作为模块 import 导入使用。如何用pybind11定义一个模块呢?用下面的代码简单解释下。

2022-11-12 16:59:47 563

原创 模型部署时的调试技巧,debug方法

【代码】模型部署时的调试技巧,debug方法。

2022-11-11 22:45:48 715

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除