李明徽的算法
scfor333
一生几十亿万步
展开
-
剑指Offer(面试题9-1)——用两个栈实现队列
剑指Offer(面试题9-1)题目请用栈实现一个队列,支持如下四种操作:push(x) – 将元素x插到队尾;pop() – 将队首的元素弹出,并返回该元素;peek() – 返回队首元素;empty() – 返回队列是否为空;注意:你只能使用栈的标准操作:push to top,peek/pop from top, size 和 is empty;如果你选择的编程语言没有...原创 2020-04-01 11:28:47 · 188 阅读 · 0 评论 -
剑指Offer(面试题8-1)——二叉树的下一个节点
剑指Offer(面试题8-1)题目给定一棵二叉树的其中一个节点,请找出中序遍历序列的下一个节点。注意:如果给定的节点是中序遍历序列的最后一个,则返回空节点;二叉树一定不为空,且给定的节点一定不是空节点;样例假定二叉树是:[2, 1, 3, null, null, null, null], 给出的是值等于2的节点。则应返回值等于3的节点。解释:该二叉树的结构如下,2的后继节...原创 2020-04-01 11:15:13 · 150 阅读 · 0 评论 -
剑指Offer(面试题6-1)——从尾到头打印链表
剑指 Offer 面试题(6-1)题目输入一个链表的头结点,按照 从尾到头 的顺序返回节点的值。返回的结果用数组存储。样例输入:[2, 3, 5]返回:[5, 3, 2]思路 在这里我们不再解释与反转链表思路相同的做法(用三个指针,改变链表结构,想了解可以看这里——反转链表) 这里我们提供另一种不改变链表结构的方式,首先我们审读题意,将链表从尾到头输出,也就是类似于后...原创 2020-04-01 10:53:34 · 134 阅读 · 0 评论 -
算法——简单理解并查集
什么是并查集 并查集是一种树形的数据结构,,用于处理一些不想交集合的合并即查询问题,我们可以通过并查集以接近O(1)的时间完成两个不相交集合的合并,并且以O(1)的时间判断一个元素属于哪个集合理解并查集 假设我们有[1, 2, 3, 4, 5]和[6, 7, 8, 9]两个集合,以并查集的思想,我们要以如下方式存储它1 6| |2 7| |3 ...原创 2020-03-27 11:15:09 · 322 阅读 · 0 评论 -
剑指Offer(面试题4-1)——二维数组中的查找
剑指 Offer——面试题 4-1题目在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。样例输入数组:[ [1,2,8,9], [2,4,9,12], [4,7,10,13], [6,8,11,15]]如果输入查找数值为7,则返回true,如果...原创 2020-03-26 22:31:18 · 925 阅读 · 0 评论 -
算法——使用单调队列解决滑动窗口问题
滑动窗口给定一个大小为n≤106的数组。有一个大小为k的滑动窗口,它从数组的最左边移动到最右边。您只能在窗口中看到k个数字。每次滑动窗口向右移动一个位置。以下是一个例子:该数组为[1 3 -1 -3 5 3 6 7],k为3。窗口位置最小值最大值[1 3 -1] -3 5 3 6 7-131 [3 -1 -3] 5 3 6 7-331 3 [...原创 2020-03-25 22:27:39 · 594 阅读 · 0 评论 -
动态规划(一)——从爬楼梯问题简单理解dp
动态规划 今天来谈一谈我对动态规划的理解,我也是初学者,这里只是通过爬楼梯这道简单的问题,介绍一下动态规划的核心思想和基于这道题的 DP 分析dp 思想 动态规划(一下简称 dp)是一种将多个阶段的问题分解成一系列单阶段问题,通过总结各阶段之间的关系得到所谓的状态转换方程,从而解决问题 dp 算法不同于二分、快排、双指针等算法,存在一个大致的模板,dp 问题因为问题要求不尽相...原创 2020-03-24 23:14:07 · 1032 阅读 · 0 评论 -
算法——前缀和及差分
前缀和及差分 前缀和与差分是互为逆运算的两种计算方式,前缀和指的是一个数组是另一个数组中前n项元素之和,而差分指的是一个数组的前n项的和是另一个数组 实际上就是,如果数组a是数组b的前缀和,那b就是a的差分前缀和 根据如上的的解释,我们可以理解为,假设有数组a为[1, 2, 3, 4, 5]那么代表它的前缀和数组的数组b就是1, 3, 6, 10, 15,也就是说,a[n] ...原创 2020-03-23 16:36:12 · 511 阅读 · 0 评论 -
剑指Offer(面试题3-2)——不修改数组找出重复的数字
剑指 Offer——面试题 3-2题目不修改数组找出重复的数字在一个长度位n + 1的数组里的所有数字都在1 ~ n的范围内,所以数组中至少有一个数字是重复的,请找出数组中任意一个重复的数字,但不能修改输入的数组输入样例[2, 3, 5, 4, 3, 2, 6, 7]输出样例2 或 3思路 这道题比较特殊的点就是不允许改变输入数组,如果不改变输入数组的话,我们就不能对数...原创 2020-03-20 23:08:43 · 227 阅读 · 0 评论 -
面试题——反转链表
AcWing 35 反转链表题目定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。思考题:请同时实现迭代版本和递归版本。样例输入:1->2->3->4->5->NULL输出:5->4->3->2->1->NULL思路迭代版本 这道题使用迭代的思想很容易思考,我们只需要准备三个指针,分...原创 2020-03-19 15:30:34 · 235 阅读 · 0 评论 -
面试题——链表中环的入口节点
AcWing 34 链表中环的入口节点题目给定一个链表,若其中包含环,则输出环的入口节点。若其中不包含环,则输出null。样例给定如上所示的链表:[1, 2, 3, 4, 5, 6]2注意,这里的2表示编号是2的节点,节点编号从0开始。所以编号是2的节点就是val等于3的节点。则输出环的入口节点3.思路 这道题解法很巧妙,有一股数学的气息,首先我们回忆一下怎么确定...原创 2020-03-18 19:15:05 · 205 阅读 · 0 评论 -
面试题——包含min函数得栈
AcWing 41 包含 min 函数得栈题目设计一个支持push,pop,top等操作并且可以在O(1)时间内检索出最小元素的堆栈。push(x)–将元素x插入栈中pop()–移除栈顶元素top()–得到栈顶元素getMin()–得到栈中最小元素样例MinStack minStack = new MinStack();minStack.push(-1);minStack....原创 2020-03-18 18:49:57 · 203 阅读 · 0 评论 -
剑指Offer(面试题3-1)——数组中的重复数字
剑指 Offer——面试题 3题目找出数组中的重复数字在一个长度为n的数组里的所有数字都在0 ~ n - 1的范围内,数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次,请找出数组中任意一个重复的数字输入样例[2, 3, 1, 0, 2, 5, 3]输出样例2 或 3思路 这道题是一个很常见的数组问题,解法也有很多种, 首先想到的我们可以...原创 2020-03-17 11:26:22 · 155 阅读 · 0 评论 -
面试题——寻找矩阵中的极小值
AcWing 1452 寻找矩阵的极小值题目给定一个n×n的矩阵,矩阵中包含n×n个_互不相同_的整数。定义极小值:如果一个数的值比与它相邻的所有数字的值都小,则这个数值就被称为极小值。一个数的相邻数字是指其上下左右四个方向相邻的四个数字,另外注意,处于边界或角落的数的相邻数字可能少于四个。要求在O(nlogn)的时间复杂度之内找出任意一个极小值的位置,并输出它在第几行第几列。本题中矩...原创 2020-03-17 11:02:33 · 1617 阅读 · 0 评论 -
面试题——单链表快速排序
AcWing 1451 单链表快速排序题目给定一个单链表,请使用快速排序算法对其排序要求:期望平均时间复杂度为O(nlogn),期望额外空间复杂度为O(logn)思考题: 如果只能改变链表结构,不能修改每个节点的val值该如何做呢数据范围链表中的所有数大小均在int范围内,链表长度在[0, 10000]输入样例:[5, 3, 2]输出样例:[2, 3, 5]思路 ...原创 2020-03-16 23:03:42 · 870 阅读 · 0 评论 -
面试题——蛇形矩阵
AcWing 756 蛇形矩阵题目输入两个整数n和m,输出一个n行m列的矩阵,将数字1到n * m按照回字蛇形填充至矩阵中。具体矩阵形式可参考样例。输入格式输入共一行,包含两个整数n和m。输出格式输出满足要求的矩阵。矩阵占n行,每行包含m个空格隔开的整数。数据范围1≤n,m≤1001≤n,m≤100输入样例:3 3输出样例:1 2 38 9 47 6 5思路...原创 2020-03-16 08:15:17 · 1083 阅读 · 0 评论 -
算法——使用DFS解决全排列问题
什么是 DFS DFS 是深度优先遍历,将序列抽象成树状结构,以优先深度的方式进行遍历,获取想要的结果例如 假设一个树的结构如下: 1 2 3 4 5 5 7 使用深度优先遍历的遍历顺序就是1->2->4->5->3->5->7,也就是说,深度优先遍历会从根节点root开始,以深度优先遍历到其一个 ...原创 2020-02-28 10:00:23 · 2271 阅读 · 0 评论 -
算法——插入排序及优化(希尔排序)
插入排序 插入排序是排序算法的一种,顾名思义,是一种插入的形态进行排序的算法原理 插入排序的过程可以形象的比做我们打扑克抓牌时,整理扑克牌的过程,每次我们抽一张新牌时,会以特定的规律,将其插入到已有的牌中,使手中的牌形成一个有序的牌的集合 插入排序也是如此我们使用两个嵌套的for循环从头开始遍历一个序列,外部的for循环顺序向下执行,内部的for循环负责比较其当前遍历的位置元...原创 2020-02-17 16:24:35 · 172 阅读 · 1 评论 -
LeetCode-98——验证二叉搜索树(Java、Python)
题目 给定一个二叉树,判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数节点的右子树只包含大于当前节点的数所有左子树和右子树自身必须也是二叉搜索树 示例:输入: 2 / \ 1 3输出: true输入: 5 / \ 1 4 / \ 3 6输出:...原创 2020-02-15 22:27:12 · 202 阅读 · 0 评论 -
LeetCode-242——有效的字母异位词(Java、Python)
题目 给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词 示例:输入: s = "anagram", t = "nagaram"输出: true输入: s = "rat", t = "car"输出: false解法 这里提供三种解法直接排序 因为大部分语言中都自带排序函数,我们可以直接把两个字符串进行排序,因为如果两个字符串互为字母异位词的话,...原创 2020-02-15 21:52:07 · 135 阅读 · 0 评论 -
LeetCode-141——环形链表(Java、Python)
题目 给定一个链表,判断链表中是否有环 为了表示给定链表中的环,我们使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。 如果pos是-1,则在该链表中没有环 示例:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个节点。输入:head = [1,2], pos = 0输出:true解释:链表中...原创 2020-02-14 22:42:05 · 105 阅读 · 0 评论 -
LeetCode-206——反转链表(Java、Python)
题目 反转一个链表 示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL解法 这道题我们需要两个额外的链表节点变量ListNode来协助完成 假设我们有一个1->2->3->4->5的链表,我们定义cur和prev两个节点变量,分别用来...原创 2020-02-14 22:05:38 · 111 阅读 · 0 评论 -
Python——递归实现斐波那契数列(LeetCode p509)
Python 递归实现斐波那契数列斐波那契数列就是除第一项和第二项外,每项都等于前两项的和的一串数列,即第N项的值为F(N-2) + F(N-1),LeetCode 原题如下:斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:F(0) = 0, F(1) = 1F(N) = F(N - 1) ...原创 2020-02-07 22:58:51 · 1880 阅读 · 0 评论 -
Python——归并排序
Python 实现归并排序原理不过多介绍了,在之前的博客中有关于快排原理的解释,连接在这里:算法——归并排序吸取了 AcWing 平台一位大神的思想,使用 Python List 的切片方式,可以避免边界值的问题,不需要考虑那么多了,下面是代码:def mergeSort(arr): if len(arr) == 1: return mid = len(ar...原创 2020-02-07 22:04:03 · 201 阅读 · 0 评论 -
Python——快速排序
Python 实现快速排序关于快排的原理,这里不做过多介绍了,在我之前的博客里有很详细的原理讲解,连接在这里:算法——快速排序的原理讲解这次是使用 Python 实现的快速排序,和 C++ 唯一的区别就是没有使用do-while,这里通过while和其他代码的配合实现了do-while的功能,直接上代码:def quickSort(list, l, r): if l == r: ...原创 2020-02-06 18:36:40 · 418 阅读 · 0 评论 -
算法——双指针算法
title: 算法——双指针算法date: 2020-01-17 21:56:51tags: 李明徽的算法双指针算法 双指针算法是指一切采用双指针的方式,降低原本暴力解法的时间复杂度的算法,通常双指针算法可以将暴力的 O(n^2)降低到 O(n) 由于双指针算法指的是一类算法,下面我用两道题来简单解释一下单词个数问题 即查找一段字符串中,以空格为分隔的单词的个数,这道...原创 2020-01-17 22:41:08 · 674 阅读 · 0 评论 -
算法——二分查找
二分算法 二分算法分为浮点数二分和整数二分,整数二分相对于浮点数二分来讲更复杂,需要考虑边界问题等二分思想 二分算法的思想是就一段有序序列来讲,想要查找其中某一个数,可以先找到位于序列中点的数,如果目标值小等于中点值,且序列是单调递增的,那么目标值一定在中点左侧,这样再用同样的方式对左侧区间进行二分,如此查找,最后就会找到要找的数字整数二分 整数二分思想上很好理解,就是将有...原创 2020-01-15 15:13:18 · 211 阅读 · 0 评论 -
算法——归并排序
归并排序 归并排序是另一种排序算法,也是采用分治的思想,但是和快排有很大的区别,归并排序是稳定的,而快排则不稳定归并的思想 归并排序的思想可以简单的分为三个步骤:确定分界点 mid递归分界点得到左右空间归并,将若干数组合并为一个有序数组确定分界点 确定分界点,归并排序的分界点即为数组的中点,设数组左边界为 left,有边界为 right,那么分界点 mid 便为...原创 2020-01-14 18:41:17 · 240 阅读 · 0 评论 -
算法——快速排序
快排 从头开始学习算法,从最简单的排序算法开始,第一个接触的就是快排,学习的平台是 AcWing,希望现在学习还不晚,对以后能有帮助快排的原理 快排使用的是分治的思想,有三个关键点:确定分界点、调整区间、递归处理左右两段,这里的思想是使用两个指针,分别对应数组的左右边界,一下简称 l 和 r,通过循环来将两个指针向中间移动直到 l 和 r 相遇,在这期间,将数组调整为小于等于分界点...原创 2020-01-13 18:25:14 · 463 阅读 · 0 评论