算法
Nathaniel333
源码爱好者/java八股文总结者/AI爱好者
展开
-
面试专栏:快排和归并排序
选择数组中的一个元素作为基准(pivot),常见的选择方法有选取第一个元素、最后一个元素、中间元素或随机元素。: 对数组进行分区,。: 对基准左边和右边的子数组递归地进行快速排序。递归的终止条件是子数组的大小小于或等于1。原创 2023-11-26 07:43:38 · 812 阅读 · 0 评论 -
LCR:29 循环有序列表的插入
给定中的一个点,写一个函数向这个列表中插入一个新元素insertVal,使这个列表仍然是循环升序的。给定的可以是这个列表中任意一个顶点的指针,并不一定是这个列表中最小元素的指针。如果有多个满足条件的插入位置,可以选择任意一个位置插入新的值,插入后整个列表仍然保持有序。如果列表为空(给定的节点是null),需要创建一个循环有序列表并返回这个节点。否则。请返回原先给定的节点。原创 2023-11-22 09:01:52 · 9 阅读 · 0 评论 -
力扣19:删除链表的倒数第n个节点
给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。原创 2023-11-04 20:04:15 · 23 阅读 · 0 评论 -
力扣21:合并两个有序链表
将两个升序链表合并为一个新的链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。原创 2023-11-04 18:45:02 · 15 阅读 · 0 评论 -
力扣113:路径总和II
给你二叉树的根节点root和一个整数目标和targetSum,找出所有路径总和等于给定目标和的路径。是指没有子节点的节点。原创 2023-11-04 15:14:29 · 23 阅读 · 0 评论 -
力扣110:平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。原创 2023-11-04 08:54:03 · 21 阅读 · 0 评论 -
力扣101:对称二叉树
给你一个二叉树的根节点root, 检查它是否轴对称。原创 2023-11-04 08:17:05 · 17 阅读 · 0 评论 -
力扣230:二叉搜索树中第k小的元素
给定一个二叉搜索树的根节点root,和一个整数k,请你设计一个算法查找其中第k个最小元素(从 1 开始计数)。原创 2023-11-04 08:10:03 · 24 阅读 · 0 评论 -
力扣236:二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(原创 2023-11-04 08:02:45 · 18 阅读 · 0 评论 -
力扣51:N皇后
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。研究的是如何将n个皇后放置在n×n的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数n,返回所有不同的的解决方案。每一种解法包含一个不同的的棋子放置方案,该方案中'Q'和'.'分别代表了皇后和空位。原创 2023-11-02 21:37:55 · 20 阅读 · 0 评论 -
力扣36:有效的数独
请你判断一个9 x 9的数独是否有效。只需要,验证已经填入的数字是否有效即可。原创 2023-11-02 21:19:25 · 17 阅读 · 0 评论 -
力扣37:解数独
编写一个程序,通过填充空格来解决数独问题。数独的解法需1-91-91-93x3数独部分空格内已填入了数字,空白格用'.'表示。原创 2023-11-02 21:10:40 · 20 阅读 · 0 评论 -
力扣695:岛屿的最大面积
给你一个大小为m x n的二进制矩阵grid。是由一些相邻的1(代表土地) 构成的组合,这里的「相邻」要求两个1必须在相邻。你可以假设grid的四个边缘都被0(代表水)包围着。岛屿的面积是岛上值为1的单元格的数目。计算并返回grid中最大的岛屿面积。如果没有岛屿,则返回面积为0。原创 2023-11-01 10:14:30 · 26 阅读 · 0 评论 -
力扣200:岛屿数量
给你一个由'1'(陆地)和'0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。原创 2023-11-01 10:05:32 · 17 阅读 · 0 评论 -
排序算法专题
(代号A)移动到根元素的位置。如果不是特殊情况,则堆的性质被破坏。但这仅仅是由于A小于其某个子元素。于是,我们可以把A和这个子元素调换位置。如果A大于其所有子元素,则堆调整好了;否则,重复上述过程,A元素在树形结构中不断“下沉”,直到合适的位置,数组重新恢复堆的性质。上述过程一般称为“筛选”,方向显然是自上而下。转载 2023-10-30 15:51:48 · 19 阅读 · 0 评论 -
力扣210:课程表II
现在你总共有numCourses门课需要选,记为0到。给你一个数组,其中,表示在选修课程ai前先选修bi。01[0,1]返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回就可以了。如果不可能完成所有课程,返回。[0,1]总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序为[0,1]。[0,2,1,3]总共有 4 门课程。要学习课程 3,你应该先完成课程 1 和课程 2。并且课程 1 和课程 2 都应该排在课程 0 之后。因此,一个正确的课程顺序是。原创 2023-10-30 15:36:04 · 45 阅读 · 0 评论 -
力扣207:课程表(拓扑排序)
你这个学期必须选修numCourses门课程,记为0到。在选修某些课程之前需要一些先修课程。先修课程按数组给出,其中,表示如果要学习课程ai则先学习课程bi。[0, 1]01请你判断是否可能完成所有课程的学习?如果可以,返回true;否则,返回false。true总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。这是可能的。false总共有 2 门课程。学习课程 1 之前,你需要先完成课程 0;并且学习课程 0 之前,你还应先完成课程 1。这是不可能的。原创 2023-10-30 15:21:08 · 29 阅读 · 0 评论 -
力扣322:零钱兑换
给你一个整数数组coins,表示不同面额的硬币;以及一个整数amount,表示总金额。计算并返回可以凑成总金额所需的。如果没有任何一种硬币组合能组成总金额,返回-1。你可以认为每种硬币的数量是无限的。原创 2023-10-25 08:30:16 · 34 阅读 · 0 评论 -
力扣1143:最长公共子序列
给定两个字符串text1和text2,返回这两个字符串的最长的长度。如果不存在,返回0。一个字符串的是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。"ace""abcde""aec""abcde"两个字符串的是这两个字符串所共同拥有的子序列。3最长公共子序列是 "ace" ,它的长度为 3。3最长公共子序列是 "abc" ,它的长度为 3。0两个字符串没有公共子序列,返回 0。原创 2023-10-23 20:44:17 · 13 阅读 · 0 评论 -
力扣5:最长回文子串
给你一个字符串s,找到s中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。"bab""aba" 同样是符合题意的答案。原创 2023-10-22 11:27:34 · 22 阅读 · 0 评论 -
力扣64:最小路径和
给定一个包含非负整数的m x n网格grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。每次只能向下或者向右移动一步。7因为路径 1→3→1→1→1 的总和最小。12。原创 2023-10-21 12:33:23 · 16 阅读 · 0 评论 -
力扣256:粉刷房子
当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个。将 0 号房子粉刷成蓝色,1 号房子粉刷成绿色,2 号房子粉刷成蓝色。个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,最少花费: 2 + 5 + 3 = 10。表示第 1 号房子粉刷成绿色的花费,以此类推。表示第 0 号房子粉刷成红色的成本花费;请计算出粉刷完所有房子最少的花费成本。原创 2023-10-21 11:59:30 · 19 阅读 · 0 评论 -
力扣18:四数之和
给你一个由n个整数组成的数组nums,和一个目标值target。请你找出并返回满足下述全部条件且的四元组bcd你可以按返回答案。原创 2023-10-21 06:23:40 · 20 阅读 · 0 评论 -
力扣15:三数之和
给你一个整数数组nums,判断是否存在三元组满足i!= ji!= k且j!= k,同时还满足。请你返回所有和为0且不重复的三元组。答案中不可以包含重复的三元组。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。注意,输出的顺序和三元组的顺序并不重要。[]唯一可能的三元组和不为 0。[[0,0,0]]唯一可能的三元组和为 0。原创 2023-10-21 06:07:38 · 16 阅读 · 0 评论 -
力扣148:排序链表
给你链表的头结点head,请将其按排列并返回。[1,2,3,4]原创 2023-10-18 19:35:43 · 23 阅读 · 0 评论 -
归并排序专题
归并排序其实就是一种分治算法 ,那么在了解归并排序之前,我们先来看看什么是分治算法。在算法设计中,我们引入分而治之的策略,称为分治算法,其本质就是将一个大规模的问题分解为若干个规模较小的相同子问题,分而治之。步骤四:进行合并操作,将两个有序的子序列合并为一个有序序列,如此下去,直到所有的元素都合并为一个有序序列。步骤三:如此下去,直到分解成一个元素停止,这时含有一个元素的子序列都是有序的。步骤一:首先将待排序的元素分成大小大致相同的两个序列。步骤二:再把子序列分成大小大致相同的两个子序列。原创 2023-10-16 21:09:37 · 16 阅读 · 0 评论 -
最长公共子序列专题
给定两个字符串text1和text2,返回这两个字符串的最长的长度。如果不存在,返回0。一个字符串的是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。"ace""abcde""aec""abcde"两个字符串的是这两个字符串所共同拥有的子序列。3最长公共子序列是 "ace" ,它的长度为 3。3最长公共子序列是 "abc" ,它的长度为 3。0两个字符串没有公共子序列,返回 0。原创 2023-10-16 16:08:45 · 12 阅读 · 0 评论 -
堆,堆排序专题
删除操作的逻辑为,删除堆的根节点,将最后一个节点补到根节点位置,得到一颗不符合规则的堆。再对根节点进行向下冒泡,即如果父节点小于某一孩子或所有孩子,将元素值最大 的孩子与父节点交换。孩子上移,父节点下移,下移后与孩子重复该操作,直到比孩子都大或没有孩子。将元素插入最后一位,再进行向上冒泡,即如果父节点的值小于被插入的元素,父节点下移,被插入的元素上移。时间复杂度取决于树的高度h。而完全二叉树的树的高度为[logn+1]的上取整,删除操作向下冒泡,操作时间还是取决于树的高度,原创 2023-10-15 22:45:55 · 15 阅读 · 0 评论 -
力扣70:爬楼梯
确定遍历顺序从递推公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,遍历顺序一定是从前向后遍历的。原创 2023-10-15 21:05:49 · 59 阅读 · 0 评论 -
力扣42:接雨水
给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。6上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。9。原创 2023-10-15 20:54:18 · 18 阅读 · 0 评论 -
力扣146:LRU缓存
本文使用HashMap和双向链表来实现LRU算法,原理如下图所示:其中:1.2.比如我要删除key为100的缓存项,那么根据HashMap的key快速找到100对应的node节点,然后在双向链表中将节点进行删除(修改前后Node的指针即可)。当然可以将双向链表替换为单链表(也能保存顺序),但是这样会有问题:1.到要删除的节点的前一个节点;2.;鉴于以上原因,所以不考虑使用单链表。原创 2023-10-15 19:53:23 · 98 阅读 · 0 评论 -
滑动窗口算法专题
其实困扰大家的,不是算法的思路,而是各种细节问题。这个算法技巧的思路非常简单,就是维护一个窗口,不断滑动,然后更新答案么。unordered_map 就是哈希表(字典),它的一个方法 count(key) 相当于 Java 的 containsKey(key) 可以判断键 key 是否存在。需要注意的是,如果该 key 不存在,C++ 会自动创建这个 key,并把 map[key] 赋值为 0。而且,这两个 ... 处的操作分别是右移和左移窗口更新操作,等会你会发现它们操作是完全对称的。转载 2023-09-26 14:35:58 · 21 阅读 · 0 评论 -
一致性哈希专题
随着业务的扩展,流量的剧增,单体项目逐渐划分为分布式系统。对于经常使用的数据,我们可以使用Redis作为缓存机制,减少数据层的压力。因此,重构后的系统架构如下图所示:优化最简单的策略就是,例如,有三台Redis,对于每次的访问都可以通过计算hash来求得hash值。如公式 h=hash(key)%3,我们把Redis编号设置成0,1,2来保存对应hash计算出来的值,h的值等于Redis对应的编号。但是hash算法也会面临容错性和扩展性的问题。容错性是指当系统中的某个服务出现问题时,不能影响其他系统。转载 2023-09-26 08:21:35 · 28 阅读 · 0 评论 -
回溯算法专题
回溯法也经常和二叉树遍历,深度优先搜索混在一起,因为这两种方式都是用了。,并不是什么高效的算法,最多再剪枝一下。此部分较难在刷回溯算法也根据以上问题顺序刷,过程中回溯法确实不好理解,所以需要把在写代码前画画图,把回溯法抽象为一个图形来理解就容易多了。(在画图过程中还可以切实知道如何更好剪枝,减去没必要的步骤。干想还是比较困难的)转载 2023-09-23 20:15:32 · 12 阅读 · 0 评论 -
背包问题专题
给定一个背包容量target,再给定一个数组nums(物品),能否按一定方式选取nums中的元素得到target 注意: 1、背包容量target和物品nums的类型可能是数,也可能是字符串 2、target可能题目已经给出(显式),也可能是需要我们从题目的信息中挖掘出来(非显式)(常见的非显式target比如sum/2等) 3、选取方式有常见的一下几种:每个元素选一次/每个元素选多次/选元素进行排列组合。转载 2023-09-23 09:41:31 · 12 阅读 · 0 评论