自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营第二十九天|Leetcode332 重新安排行程、Leetcode51 N皇后、Leetcode37 解数独

由示例[[“MUC”, “LHR”], [“JFK”, “MUC”], [“SFO”, “SJC”], [“LHR”, “SFO”]] ,这是有4个航班,那么只要找出一种行程,行程里的机场个数是5就可以了,也就是回溯遍历过程中,如果达到了(航班数量+1),就找到了一个形成课可以把所有航班穿起来;递归深度就是row控制棋盘的行,每一层里for循环的col控制棋盘的列,一行一列,确定了放置皇后的位置。因为在单层搜索的过程中,每一层递归,只会选for循环里的一个元素,所以对于行而言不需要做检验操作;

2024-03-25 20:04:20 918

原创 代码随想录算法训练营第二十九天|Leetcode491 递增子序列、Leetcode46 全排列、Leetcode47 全排列 II

需要continue,当元素未被选择过则将used[i]置为true并将元素加入path中,回溯过程需要重新将used[i]置为false并弹出path中最后一个元素。输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

2024-03-25 15:19:29 847

原创 代码随想录算法训练营第二十七天|Leetcode93 复原IP地址、Leetcode78 子集、Leetcode90 子集II

假如收集结果在终止条件之后,当遍历到最后一个元素时,则直接返回到上一层,对于全集结果无法正常收集,因此需要在进入回溯函数的时候就需要立刻收集结果;对元素进行标记,同一层中选择相同元素时,后续递归结果相同,而树枝上可以选择相同元素,不会产生相同后续结果。时,我们对最后一个子段进行合法性检验,如果合法,则IP地址被复原,负责继续向下进行递归回溯;输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]

2024-03-24 17:22:43 780

原创 代码随想录算法训练营第二十六天|Leetcode39 组合总和、Leetcode40 组合总和II、Leetcode131 分割回文串

我们可以这样想,在示例一中,我们在第一层递归中取1,第二层递归中取剩余元素中的1,第三层递归中取剩余元素中的6,相加总和等于target,因此对于深度而言,是允许想等元素被取得的;解决了怎么去重的问题,我们还需要考虑在那些时候进行去重,我们是应该在广度范围进行去重还是在深度范围进行去重,也就是对树形结构的树层进行去重还是对树枝进行去重?的1,剩余元素为[10, 1, 2, 7, 6, 5],对于两个元素其深度取值的结果是相同的,因此我们需要从树层(也就是广度上)进行去重;返回 s 所有可能的分割方案。

2024-02-26 21:31:35 899

原创 代码随想录算法训练营第二十五天|Leetcode216 组合总和III、Leetcode17 电话号码的字母组合

对于电话号码的字母组合,就是依次地从每一个字符串中取一个字符进行配对,也能转换为相对应的树形结构,递归深度取决于输入数字的个数,宽度取决于第一个字符串的大小。在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。我们需要将字符串与输入的数字字符串进行一个映射,因为是对全局变量进行修改,因此该函数不需要任何返回值,参数需要传入。因为递归和回溯必须相匹配,所以我们在递归结束之后,从s中弹出当前遍历字符,然后进行之后的递归操作。

2024-02-22 22:40:18 893

原创 代码随想录算法训练营第二十四天|回溯算法、Leetcode77 组合

回溯算法实际上是一个类似枚举的搜索过程,目的是再搜索尝试的过程中国寻找到问题的解,当发现条件不满足时就会进行回溯,尝试其他路径。最简单的一个例子就是迷宫,求解条件为找到迷宫出口,我们从入口出发,会遇到很多岔路,也就是回溯算法的不同路径,当遇到“死路”的时候,即求解条件不满足,需要回溯走其他可能通向终点的路径,直到获得从入口到出口的路径集;同时,回溯与递归会同时出现,往往在递归的下一步就是进行回溯。

2024-02-21 23:14:04 856

原创 代码随想录算法训练营第二十三天|Leetcode669 修剪二叉搜索树、Leetcode108 将有序数组转换为二叉搜索树、Leetcode538 把二叉搜索树转换为累加树

对于构建平衡的二叉搜索树,因为给定的数组按严格递增顺序排列,我们在构建二叉搜索树的过程中不需要担心太多,重点在于我们如何构建的二叉搜索树是平衡的?输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]输入:root = [3,0,4,null,2,null,null,1], low = 1, high = 3。输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]

2024-02-20 21:50:53 1021

原创 代码随想录算法训练营第二十二天|Leetcode235 二叉搜索树的最近公共祖先、Leetcode701 二叉搜索树中的插入操作、Leetcode450 删除二叉搜索树中的节点

(3)删除结点左子树不为空,右子树为空:对于该类结点称为左单分支结点,但处理也是非常简单,因此当我们删除当前结点之后,其分支依旧能与原二叉搜索树构成二叉搜索树,不会改变结构,所以将其父结点的左孩子指向删除结点的左孩子即可;我们需要先找到右子树的最左结点,因为二叉搜索树右子树的最左结点值一定是大于其左子树所有结点但在右子树是最小值,然后将左子树全部嫁接到该结点,此操作就是保证二叉搜索树在删除结点后仍然是二叉搜索树,再删除结点即可。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。

2024-02-19 21:45:22 877

原创 代码随想录算法训练营第二十天|Leetcode530 二叉搜索树的最小绝对差、Leetcode501 二叉搜索树中的众数、Leetcode236 二叉树的最近公共祖先

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1。输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4。(1)当左结点返回值为空,右结点返回值不为空,我们将右结点返回值向上一次递归返回即可;

2024-02-18 22:20:20 825

原创 代码随想录算法训练营第十九天|Leetcode654 最大二叉树、Leetcode617 合并二叉树、Leetcode700 二叉搜索树中的搜索、Leetcode98 验证二叉搜索树

(2)当root1结点为空,root2结点不为空或者root1结点不为空,root2结点为空时,我们可以进行合并,统一条件为。-[3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5]。-[3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5]。-[3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1]。-[3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1]。

2024-02-17 22:21:29 869 1

原创 @[TOC](代码随想录算法训练营第十八天|Leetcode513 找树左下角的值、Leetcode112 路径总和、Leetcode106 从中序与后序遍历序列构造二叉树

如果存在,返回 true;否则,返回 false。我们需要得到的是左下角的值,显然左下角的值不管是上一层结点的左孩子或者右孩子,都一定会是叶子结点,同时我们需要对其深度进行判断,因此左下角的值一定处于二叉树的最后一层,即深度最大;输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22。不难看出,通过前序遍历或者后序遍历能很快知道根结点的值,因为根结点值为前序遍历的第一个元素,为后序遍历遍历的最后一个元素,因此。

2024-02-16 21:58:46 912 1

原创 代码随想录算法训练营第十七天|Leetcode110 平衡二叉树、Leetcode257 二叉树的所有路径、Leetcode404 左叶子之和

在之前的文章中已经讨论过对于高度和深度使用哪种遍历方式最优,因为我们需要将子树的平衡结果返回给上一结点,所以我们必然需要先遍历左右结点随后中结点才能达到目的,因此我们在单层递归中使用。因为我们需要将左右子树的左叶子之和返回给其父结点,因此需要先对左右遍历,然后在处理中时将左右子树的左叶子结点加和返回给自身即可,因此其单层遍历逻辑使用。如果我们遍历到叶子结点的时候,我们无法将叶子结点的值返回给其父结点,因此我们只需要遍历到其父结点,通过。输入:root = [1,2,2,3,3,null,null,4,4]

2024-02-15 21:01:08 1630 1

原创 代码随想录算法训练营第十六天|Leetcode104 二叉树的最大深度 、Leetcode111 二叉树的最小深度、Leetcode222 完全二叉树的节点个数

输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]假如左结点存在,则深度加一,然后向左孩子递归,每结束一次左孩子的递归需要深度减一,才能对右孩子进行递归,最后返回最大值即可。函数分别获取左右子树的高度,而对于二叉树的最大高度则是取两者的最大值随后加上根结点的一层即可。对于最大深度的解决,使用前序和后序遍历都可以,因为返回的都是根节点到叶子节点的最大距离。

2024-02-13 22:34:41 1783 1

原创 代码随想录算法训练营第十五天|层序遍历、Leetcode226 翻转二叉树 、Leetcode101 对称二叉树2

解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]题目描述:给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。题目描述:给你二叉树的根节点 root ,返回其节点值的 层序遍历。

2024-02-12 18:46:50 1005 1

原创 代码随想录算法训练营第十四天|二叉树理论基础、递归遍历、迭代遍历、统一迭代

链式存储int val;

2024-02-11 18:33:39 810 1

原创 代码随想录算法训练营第十三天|Leetcode239 滑动窗口最大值、Leetcode347 前 K 个高频元素

如果使用C++基本数据类型,可以直接使用自带的less和greater这两个仿函数(默认使用的是less,就是构造大顶堆,元素小于当前节点时下沉)。我们在k个元素内,需要维护的区间内的最大元素,当区间内最大元素不变,插入元素小于等于最大元素,就没必要插入。对频率进行排序,我们很快能想到的是快排,但使用快排要将map转换为vector的结构,然后对整个数组进行排序, 而这种场景下,我们其实只需要维护k个有序的序列就可以了,所以使用优先级队列是最优的;在这里,我们自定义一个单调队列,使得k个元素从大到小排列。

2024-02-06 01:35:47 790 1

原创 代码随想录算法训练营第十一天|Leetcode20 有效的括号 、Leetcode1047 删除字符串中的所有相邻重复项、Leetcode150 逆波兰表达式求值

当遇到相邻元素进行处理,不管是消除还是匹配,使用栈的目的是可以获取遍历的前一个元素,从而进行处理。

2024-02-04 00:00:20 821 1

原创 代码随想录算法训练营第九天|KMP算法、Leetcode28 实现 strStr()、Leetcode459 重复的子字符串

因为 这是相等的前缀和后缀,t[0] 与 k[0]相同, t[1] 与 k[1]相同,所以 s[0] 一定和 s[2]相同,s[1] 一定和 s[3]相同,即:,s[0]s[1]与s[2]s[3]相同。因为 这是相等的前缀和后缀,t[2] 与 k[2]相同 ,t[3]与k[3] 相同,所以,s[2]一定和s[4]相同,s[3]一定和s[5]相同,即:s[2]s[3] 与 s[4]s[5]相同。为什么要前一个字符的前缀表的数值呢,因为要找前面字符串的最长相同的前缀和后缀,所以要看前一位的 前缀表的数值。

2024-02-03 01:41:56 950 1

原创 代码随想录算法训练营第十天|栈和队列、Leetcode232 用栈实现队列、Leetcode225 用队列实现栈

由Silicon Graphics Computer Systems公司参照HP STL实现,主要设计者也是STL之父Alexandar Stepanov,被Linux的C++编译器GCC所采用,SGI STL是开源软件,源码可读性甚高。C++STL的版本实现有很多,包括:HP STL、SGI STL、STL Port、P.J.Plauger STL和Rouge Wave STL等。栈提供push和pop等接口,元素操作遵守先进后出的规则,因此栈不提供走访功能,也不提供迭代器。你所使用的语言也许不支持栈。

2024-02-02 01:22:18 844

原创 代码随想录算法训练营第八天|Leetcode344 反转字符串、Leetcode541 反转字符串II、卡码网54 替换数字、Leetcode151 翻转字符串里的单词、卡码网55 右旋转字符串

给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。题目描述:给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。第二行为字符串 s,代表需要旋转的字符串。解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。

2024-02-01 01:29:58 867 1

原创 代码随想录算法训练营第七天|Leetcode454 四数相加II、Leetcode383 赎金信、Leetcode15 三数之和、Leetcode18 四数之和

题目描述:给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]输入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]进行去重的话,将会pass{0,0,0}进入结果集,导致返回结果不完全。输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

2024-01-31 17:44:14 862

原创 代码随想录算法训练营第六天|Leetcode242 有效的字母异位词、Leetcode349 两个数组的交集、Leetcode202 快乐数、Leetcode1 两数之和

我们知道使用哈希法时是需要查询一个元素是否出现过,或者一个元素是否在集合里的时候。当我们使用hash解决本题的时候,因此会将数组中遍历过的元素插入到hashtable中,在之后遍历其他元素的时候,正是在hashtable中查询是否在集合中存在,因此可以使用hash。(2)为什么使用本题使用对于本题而言,我们需要知道在hashtable中是否存在某个元素,同时还需要直到这个元素在原数组中的位置才能在最后将其返回,因此必须使用map。而相对于multimap和map。

2024-01-30 00:36:52 915 1

原创 代码随想录算法训练营第四天|Leetcode24 两两交换链表中的节点、Leetcode19 删除链表的倒数第N个节点、Leetcode面试题 02.07. 链表相交、Leetcode142 环形链表

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3。输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。题目描述:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

2024-01-27 22:28:29 893 1

原创 代码随想录算法训练营第三天|Leetcode203 移除链表元素、Leetcode707 设计链表、Leetcode206 反转链表

双向链表中不仅有指向后一个节点的指针,还有指向前一个节点的指针。而链表通过不连续的储存方式,自适应内存大小,以及指针的灵活使用,巧妙的简化了上述的内容。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。题目描述:给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点。对于数组而言存在一个最大的缺点,就是我们的插入和删除时需要移动大量的元素,需要消耗大量的时间,同时必须为数组开足够的空间,否则有溢出风险。

2024-01-27 01:34:01 787 1

原创 代码随想录算法训练营第二天|Leetcode977 有序数组的平方 、Leetcode209 长度最小的子数组、Leetcode59 螺旋矩阵II

实际的时间复杂度主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n 也就是O(n)题目描述:给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。我们需要考虑的是,应该先寻找到满足条件的区间是从起始位置到哪,因此对于for循环我们需要遍历的就是滑动窗口的。输入:target = 11, nums = [1,1,1,1,1,1,1,1]

2024-01-26 02:07:52 879 1

原创 代码随想录算法训练营第一天|Leetcode704 二分查找、Leetcode27 移除元素

二分查找、移除元素

2024-01-25 02:12:52 826 1

原创 【Linux】粘包问题

粘包的产生会对后面数据的逻辑判断产生影响,但对于粘包的处理取决于粘包是否有影响,如果粘包会产生影响就需要我们去解决,没有影响可以选择不解决(比如文件传输没有影响)。

2022-11-04 14:56:21 347 1

原创 【Linux】三次握手和四次挥手详解

​ TCP 协议提供的是:面向连接、可靠的、字节流服务。使用 TCP 协议通信的双发必须先建立连接,然后才能开始数据的读写。双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。TCP 连接是全双工的,双方的数据可以通过一个连接进行读写。完成数据交换之后,通信双方都必须断开连接以释放系统资源。

2022-11-03 18:40:04 682

原创 【Linux】SOCKET编程

传统的进程间通信借助内核提供IPC机制进行,但是只能限制于本机通信,若要进行跨机通信,就要使用网络通信。​ 网络通信的本质是借助内核提供SOCKET伪文件的机制进行通信,实际上是使用了文件描述符,因此需要使用内核提供的socketAPI函数库(在传输层层面进行)。

2022-10-29 18:05:55 2940 1

空空如也

空空如也

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

TA关注的人

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