
力扣刷题
大号密码忘了
一枚非常普通的计算机2020级大学生
展开
-
JS 中序遍历+后序遍历构建二叉树
106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)递归的四大要素:确认递归函数的参数,递归函数单层循环的处理逻辑,递归函数的返回值,递归结束条件;后序遍历根结点最后被访问,所以后序遍历顺序的末尾结点为整棵树的根结点,在中序遍历中找到该结点的位置,根据该位置对中序数组和后续数组进行切割,重新切割为左数组和右数组。注意:中序数组切割的左右数组的大小 与 后续数组切割的数组大小是相同的,后续数组只需要跟着中序数组切割左右数组的长度进行切割就好。切割的时候要注意 后续遍历末尾元素是已经被使用了的原创 2022-07-13 10:31:26 · 323 阅读 · 0 评论 -
力扣235和236 二叉树的最近公共祖先问题
236. 二叉树的最近公共祖先 - 力扣(LeetCode) 235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode)原创 2022-06-29 21:38:36 · 200 阅读 · 0 评论 -
力扣501 二叉搜索树中的众数
501. 二叉搜索树中的众数 - 力扣(LeetCode)中序遍历二叉搜索树是有序序列;根据中序遍历二叉搜索树是有序序列这一特点,设置频率变量 count ,最大频率变量 maxCount,存储上一个结点值变量 temp 来进行当前结点值出现的频率以及是否需要推入结果数组当中。如果上一个结点与当前结点值相同,则该结点的频率 + 1;遍历每一个结点都把当前结点出现的频率与最大频率进行比较,若某一个结点出现的频率大于最大频率了,最大频率就要被替换,由于最大频率被替换了,所以之前结果数组当中记录的值也都要清空并重原创 2022-06-28 14:17:44 · 350 阅读 · 0 评论 -
力扣93-复原IP地址
这道题本质是在分隔字符串,需要把给定的字符串分割成四个部分,每个部分满足IP地址的条件就是正确的IP地址,分割的题用回溯解决。这道题难点在于判断情况比普通回溯题的情况要复杂一些,比如有很多种情况让程序回溯回去,而不只是一俩个确定的不满足条件。首先根据题目描述,一个正确的IP地址由四个IP分段组成,每个IP分段有数字大小和格式的限制,观察发现每个IP分段最多由三位数构成,最少由一位数构成,四个IP分段必须都是这个标准,由此可以得出判断IP地址是否正确的条件。如果满足正确IP地址条件,就推入准备好的 res 结原创 2022-06-23 21:13:18 · 191 阅读 · 0 评论 -
希尔排序---JS实现详解
将无序数组分割成若干子序列,子序列不是逐段分割的,而是相隔特定增量的子序列,对各个子序列进行插入排序,然后再选择一个更小的增量,再将之前排序后的数组按这个增量分割成多个子序列,...,不断选择更小增量,直到增量为1时,再对序列进行一次插入排序,使序列最终成为有序序列,排序完成。所以关键是确认一个有规律的逐渐递减的增量,这里的首选增量为n/2,每次增量为原先的1/2,直到增量为1 从增量开始,减去增量本身,得到的就是与该元素相差增量个的前一个元素增量依次递增,每次减去增量本身,就依次得到了与该元素相差增量个原创 2022-06-21 14:37:10 · 536 阅读 · 0 评论 -
折半插入排序算法---JS实现详解
折半插入排序是插入排序的一种,因为从被排序数组的第二个元素位置开始,每一次循环结束前部分数组都是保持有序的。而二分搜索算法的前提就是数组有序,所以可以利用二分搜索算法查找要将元素插入到前部分有序数组的哪个位置,进而提高效率。...原创 2022-06-20 23:46:46 · 262 阅读 · 0 评论 -
JS 创建并初始化数组的各种方法与坑
刷力扣买卖股票系列问题时在创建与初始化数组上遇到了很多自己不知道的知识点,写篇博客记录一下。// 含义:创建一个三个坑位的数组,每个坑位又初始化为一个二维数组// 注意:fill方法如果填充的是复杂数据类型的数据(对象和数组)那么所有被填充项引用的都是同一个对象而不是对象的拷贝,也就是说改变一个另外的都会跟着变// 解决方法:// 想要修改数组的时候要单独的替换整个数组需要用双重 for 循环进行初始化4.利用数组的map方法快速生成二维数组。注意:在这个方法中,不能将删除,因为原创 2022-06-19 22:06:48 · 5246 阅读 · 0 评论 -
回溯算法总结---子集组合类问题
DFS 是一个劲的往某一个方向搜索,而回溯算法建立在 DFS 基础之上的,但不同的是在搜索过程中,达到结束条件后,恢复状态,回溯上一层,再次搜索。因此回溯算法与 DFS 的区别就是有无状态重置当问题需要 "回头",以此来查找出所有的解的时候,使用回溯算法。即满足结束条件或者发现不是正确路径的时候(走不通),要撤销选择,回退到上一个状态,继续尝试,直到找出所有解为止78. 子集 - 力扣(LeetCode)子集类题目,答案从空集开始,集合中包含一个元素的,集合中包含俩个元素的.......集合中包含给定数组个原创 2022-06-13 12:21:41 · 334 阅读 · 0 评论 -
力扣198---打家劫舍
198. 打家劫舍 - 力扣(LeetCode) // dp数组对应下标元素存放的是 当前下标个房子中能打劫的最高金额 // 房子每增加一个,计算当前房子个数可以打劫的最高金额为: // 当前新增房子金额 与 上上一个(防止报警要隔一个房子)房子数目能打劫最高金额之和 与 除去当前新增房子以外 也就是目前房子数目减去1个房子时能打劫的最高金额的较大值 // 核心思路就是 房子不能挨着 每次房子新增一个后 当前能打劫的最高金额是已经计算完成并存入dp数组的 // 所以要么是 新增原创 2022-06-10 00:50:57 · 187 阅读 · 0 评论 -
二叉树先中后续非递归遍历算法--JS版
一:先序遍历的非递归写法思路:递归遍历本质是递归函数不断调用自身,在不断调用自身的过程会产生一个递归堆栈,所以非递归的核心思想就是用一个栈模拟递归时产生的递归堆栈。1.先序遍历的输出顺序为:根左右,想要第一次就输出根节点的值就需要在创建栈时先传入根节点,且每向下遍历一个新节点时都会先输出这个节点的值。2.循环条件为栈不为空3.因为每向下遍历一个新节点时都会先输出这个节点的值,所以每次循环都要先出栈一个元素并访问它的值,然后向栈中添加出栈节点的左右子树。4.因为栈是后进先出,所以为了实现根左右的遍历顺序,原创 2022-06-08 16:59:14 · 451 阅读 · 0 评论 -
力扣101 对称二叉树 递归解法
101. 对称二叉树 - 力扣(LeetCode)给你一个二叉树的根节点 , 检查它是否轴对称。示例 1:输入:root = [1,2,2,3,4,4,3]输出:true递归思想:递归思想的核心可以分为:分,解,合;分:把题目拆分成更小且可以用同一种方法处理的小题目;解:把解决小题目的方法写成函数,此函数就是递归函数,要注意递归函数的截止条件是什么;合:把递归函数递归的结果结合到一起,得到最终整到题目的结果;// 分:获取俩个树的左子树1和右子树2// 解:判断树1的左子树和树2的右子树是否是原创 2022-06-07 19:13:46 · 269 阅读 · 0 评论 -
JS-快速排序和归并排序
核心思路:不断的折半拆分,以 数组长度 / 2 为数组中间值拆分为左侧数组和右侧数组。不断递归继续拆分已经拆分出来的左侧数组和右侧数组直到满足递归结束条件:拆分出来的数组的长度为 1。让每次递归结束返回的数组是有序的:设置临时数组,比较左右侧数组首元素的大小,较小的首元素移除数组推入到临时数组当中。改变原数组。二:快速排序随便以数组的某一个元素为基准(方便起见所以以数组第一个元素为基准),比基准元素小的加入到新左侧数组当中,比基准元素大的加入到新右侧数组当中。不断让新左侧数组和右侧数组递归以上方法原创 2022-06-10 00:47:51 · 240 阅读 · 0 评论 -
数据结构---堆
一;什么是堆?堆是一种特殊的完全二叉树,所有的节点都大于等于(最大堆)或小于等于(最小堆)它的子节点二;JS中的堆1.JS中通常用数组表示堆。2.左侧子节点的位置是 2 * index + 13.右侧子节点的位置是 2 * index + 24.父节点的位置是(index - 1)/ 2三;堆的应用堆能高效、快速的找出最大值和最小值,时间复杂度为O(1);找出第 K 个最大(小)元素 四;JS实现堆的基本操作(入堆,删除堆顶,堆长度,取堆尾)...原创 2022-06-04 18:53:21 · 95 阅读 · 0 评论 -
力扣133 克隆图
133. 克隆图 - 力扣(LeetCode)// 图的核心就是 结点与它的邻接结点// 所以克隆图就是克隆图的各个结点与这些结点的邻接关系// 每次dfs算法传入的就是当前结点,dfs内继续递归的内容就是该结点的邻接结点详细步骤在代码注释当中......原创 2022-06-04 11:15:44 · 206 阅读 · 0 评论 -
力扣417 太平洋大西洋水流问题
417. 太平洋大西洋水流问题 - 力扣(LeetCode)核心:建立两个和给定矩阵宽高一致的矩阵,分别表示太平洋和大西洋从边界出发,深度优先遍历矩阵,继续递归前进行条件的限制:结点没有超出界限,下一个结点的值要比上一个结点的值大,结点没有被访问过。满足条件则向下一个结点递归,并将矩阵的该结点值变为 true。最后如果太平洋矩阵和大西洋矩阵的结点同时为 true 则表示这个结点是 既可流向太平洋也可流向大西洋。...原创 2022-06-02 22:06:57 · 253 阅读 · 0 评论 -
力扣65 有效数字 JS
65. 有效数字 - 力扣(LeetCode)利用图解决这种需要分很多情况讨论的题目。构建一个图,每个结点表示一种情况,相邻结点之间是到达各种情况的条件,每个结点能达到的下一个结点必须是符合题意要求的情况,否则直接判定为无效数字。分清哪个到达哪个结点时是满足题意的。如果最后遍历完给定字符串后结点数为满足题意的结点数,就是有效数字。如果最后遍历完给定字符串后结点数为不满足题意的结点数,就是无效数字。由题意构建出的图 使用图的 邻接表 表示法把上述图结构书写出来(JS使用对象表示图)遍历给定字符串,从结点0出发原创 2022-06-02 11:47:05 · 228 阅读 · 0 评论 -
图的深度与广度优先遍历
1.邻接矩阵表示法:使用二维数组进行表示,若存在俩结点之间的邻接关系,则对应二维数组下标记为 1 否则记为 02.邻接表表示法:邻接表就是依次存储记录每个结点与该结点存在邻接关系的所有结点的对应关系如上图,与V1结点存在邻接关系的结点为V2和V4 所以V1结点为头结点的单链表存储的是V2和V4对应的数组下标值在JS中可以使用对象模拟邻接表从某一个根结点开始,对根结点的没有被访问过的相邻结点挨个进行深度优先遍历。结合队列实现广度优先遍历先将根结点入队,依次出队,每次出队的时候将出队结点的没有被访问过的邻接结点原创 2022-06-01 23:42:20 · 102 阅读 · 0 评论 -
力扣112,113 路经总和(深度遍历解法)
112. 路径总和 - 力扣(LeetCode)113. 路径总和 II - 力扣(LeetCode)这俩道题都是使用DFS深度遍历算法求解的,一个是单纯求路径和,一个是求满足条件的路径。关键是怎么解决同一结点的左右叶子结点的路径和路径和计算问题。比如我到了 7 这个叶子结点,将 7 进行了累加路径和或者推入了路径数组,但是发现它不是满足条件的叶子结点路径,怎么消除该叶子结点的影响继续 2 这个右叶子结点呢?技巧:DFS深度遍历函数的参数不仅仅是下一个结点,再额外传入当前结点的路径累加值和路径数组。/原创 2022-05-31 21:36:33 · 235 阅读 · 0 评论 -
力扣102 二叉树层序遍历
102. 二叉树的层序遍历 - 力扣(LeetCode)注意要设置结点层级,所以推入队列和从队列拿出的都是包含结点和层级的数组。// 层次遍历:// 初始化一个队列// 将根结点推入队列,遍历队列,遍历条件为队列不为空// 出列队列队首元素// 访问该元素的左右孩子,有左右孩子则推入队列中// 递归以上var levelOrder = function (root) { if (!root) return []; let queue = []; let res原创 2022-05-21 10:58:45 · 254 阅读 · 0 评论 -
力扣76 最小覆盖子串 JS Map字典+滑动窗口
76. 最小覆盖子串 - 力扣(LeetCode)个人感觉:核心是利用 map 建立一个被包含字符串的字典,并记录好这个被包含字符串中每个元素(键名)出现的次数(键值)。移动指针遍历,利用 map 的 has 方法,如果遇到被包含字符串中的元素,字典中对应元素的键值做出相应的改变。当字典中所有键名对应的键值都为 0 时,意味着字符串都被包含了,进行窗口的缩小。坑:移动右指针时:只有字典元素对应键值为 0 的时候 ,记录被包含字符串总个数才进行 -1移动左指针时:只有字典元素对应键原创 2022-05-17 21:08:24 · 185 阅读 · 0 评论 -
力扣3 无重复字符串的最长字串 JS Map+滑动窗口
3. 无重复字符的最长子串 - 力扣(LeetCode)// 字典结合滑动窗口// 设置 左右双指针 用于确定滑动窗口的大小// 遍历字符串,不断的向字典中加入元素// 当右指针指向的元素值存在于字典当中,则让左指针指向重复元素的下一位(更新窗口)var lengthOfLongestSubstring = function (s) { let map = new Map(); let left = 0; let res = 0; for (let right原创 2022-05-17 16:47:59 · 204 阅读 · 0 评论 -
力扣2 俩数相加 --- JS
2. 两数相加 - 力扣(LeetCode)/** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } *//** * @param {ListNode} l1 * @param {ListNode}原创 2022-05-16 15:55:06 · 543 阅读 · 0 评论 -
力扣347 前 K 个高频元素 -- JS
347. 前 K 个高频元素 - 力扣(LeetCode) (leetcode-cn.com)一;使用对象进行解题,对象的属性为给定数组的元素,属性值为给定数组元素出现的次数;二;把对象转成数组,为之后根据对象属性值进行排序做准备;三;代码:var topKFrequent = function (nums, k) { let obj = {}; // 给对象填加属性 // key:数组元素;value:数组出现的次数 nums.forEach((item)原创 2022-05-03 17:07:09 · 566 阅读 · 0 评论 -
力扣239 滑动窗口最大值--JS解法
239. 滑动窗口最大值 - 力扣(LeetCode) (leetcode-cn.com)题目:给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值 。算法核心:1.维护一个大小为 K 的队列(数组)头部是 该队列最大的单调队列;方法:推入元素之前,与该大小为K的队列的 队尾元素 进行比较,如果 推入元素 比 队尾元素 大,则删除 队尾元素,直到大小为 K 的原创 2022-05-03 16:06:13 · 308 阅读 · 0 评论 -
力扣--链表相交
面试题 02.07. 链表相交 - 力扣(LeetCode) (leetcode-cn.com)/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {原创 2022-04-30 10:29:37 · 660 阅读 · 0 评论 -
力扣19 删除链表倒数第N个结点--双指针法
19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) (leetcode-cn.com)/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */// 思路:// 利用双指针,先让快指针先走n步// 然后快指针和慢指针同时走,直到快指针指向了末尾结点// 此时慢指针指向就是要删除结点的前一个结点//原创 2022-04-29 16:47:05 · 216 阅读 · 0 评论 -
力扣24 俩俩交换链表节点---虚拟头结点
24. 两两交换链表中的节点 - 力扣(LeetCode) (leetcode-cn.com)1.创建一个虚拟头结点,统一交换节点的操作;2.画图确定好交换顺序,按照交换顺序严格执行;3.确定好一个指针指向交换节点的起始标志(交换该指针的下一位和下下一位);4.确认循环条件:标志指针的下一节点和下下节点存在不为空/** * Definition for singly-linked list. * struct ListNode { * int val; *原创 2022-04-29 16:18:00 · 667 阅读 · 0 评论 -
力扣209【数组】C语言-长度最小的子数组---滑动窗口(双指针)
209. 长度最小的子数组 - 力扣(LeetCode) (leetcode-cn.com)一;窗口核心元素:1.窗口中所有数值总和2.窗口的大小3.窗口大小的替换(要最小的)二;为什么符合条件后要进入 while 循环若窗口的最后一位数值很大,窗口的起始位置向后移动一个之后整个窗口的数值依旧大于目标值,就需要继续移动窗口起始位置。三;最终返回最小子数组长度时的判断// 滑动窗口解法(双指针法)var minSubArrayLen = function (target,原创 2022-04-28 16:04:30 · 241 阅读 · 0 评论 -
力扣【数组】有序数组的平方---双指针法
977. 有序数组的平方 - 力扣(LeetCode) (leetcode-cn.com)数组是有序的,要求数组中每个元素平方后重新排序成新的升序数组因为数组升序,所以平方后的数组最大值一定是在俩端,所以开辟一个新数组,长度和原数组一样大,从新数组的最后一位开始存入。双指针一个在原数组最开头,一个在原数组最末尾,比较双指针所对应数组值平方后的大小,将大的值存入新数组的最后一位,对应的指针向前或向后移动。数组左闭右闭,所以循环条件是 左指针下标 <= 右指针下标// 双指针解法原创 2022-04-28 15:32:52 · 177 阅读 · 0 评论 -
力扣【数组】移除元素--双指针法
27. 移除元素 - 力扣(LeetCode) (leetcode-cn.com)本题中使用双指针法(快慢指针)实现用一个 for 循环完成俩个 for 循环的任务。题中要求不开辟新的数组空间,只操作原数组思路: 慢指针初始化下标为 0,快指针初始化下标也为 0,但是用快指针当作 for 循环的循环条件,慢指针是更改原数组的核心,只有快指针对应数组下标的值不为要删除的元素,才会给慢指针对应下标的数组赋值,否则就会让快指针继续向下指而不给慢指针所对应的数组元素赋值。// 快...原创 2022-04-28 15:03:30 · 196 阅读 · 0 评论