LeetCode
Always--Learning
选择远远大于努力
展开
-
这一次,彻底梳理各种布局问题
这种方式会使得超出的元素隐藏,对行内元素无效,必须是块级元素,隐藏之后元素依然占据着位置。这种方式会使得元素的透明度为0,隐藏,但是位置依然占据着。这种方式会使得元素不存在,但是占据的位置依然存在。这种方式会使得元素不存在,占据的位置也不存在。...原创 2022-07-20 20:43:54 · 685 阅读 · 1 评论 -
CSS元素隐藏的方式与区别
这种方式会使得超出的元素隐藏,对行内元素无效,必须是块级元素,隐藏之后元素依然占据着位置。这种方式会使得元素的透明度为0,隐藏,但是位置依然占据着。这种方式会使得元素不存在,但是占据的位置依然存在。这种方式会使得元素不存在,占据的位置也不存在。...原创 2022-07-15 18:21:51 · 1572 阅读 · 0 评论 -
LeetCode——226. 翻转二叉树(BFS)
二叉树镜像和反转二叉树是一个题目,总的来说通过BFS可以高效的解决这个问题。原创 2022-06-24 10:06:37 · 554 阅读 · 0 评论 -
LeetCode——二叉搜索树的第k大节点(借助中序遍历)
二叉搜索树的第K大节点是一个很好的题目,我原本想的是直接对二叉搜索树进行遍历,然后进行排序,然后返回第K大的节点,但是这样做显然是没有利用二叉搜索树的特点,尤其是没有利用二叉搜索树进行中序遍历的特点,只要知道了二叉搜索树的中序遍历的特点,便可迎刃而解。...原创 2022-06-20 10:22:57 · 376 阅读 · 1 评论 -
LeetCode——138. 复制带随机指针的链表(借用map实现复制)
复杂链表的复制看起来挺难的,但是实际上只要能够想到通过map这个数据结构来辅助我们进行复制,便可以极大的降低问题的复杂度,假如不借助map,直接在链表本身进行操作的话,我们不仅要考虑next指针还要考虑random指针,困难程度可想而知,所以能否想到借助map是本题的破题核心。...原创 2022-06-18 22:29:14 · 209 阅读 · 0 评论 -
嵌套数组反转(递归)
首先,最长递增子序列,中的序列二字如何理解,序列值得是可以不连续的,也就是说我们的代码只要能够找到给定数组中的最长递增的一组数即可,其实这类题目的本质就是考察动态规划,当前元素之前的最长递增子序列加上当前就是最长递增子序列,这也是整个动态规划的核心,因此,要想搞懂动态规划,必须深刻理解动态方程,理解dp[i]的含义,尤其是当我们拿到一个新题目没有思路的时候,就可以去理解动态方程的含义,然后跟着代码走一遍流程便可以理解这个题解。类似的题目还有很多,动态规划是面试中必考题之一,同时工作中也经常需要用到他们,动态原创 2022-06-15 10:34:34 · 443 阅读 · 0 评论 -
LeetCode——300. 最长递增子序列(动态规划)
首先,最长递增子序列,中的序列二字如何理解,序列值得是可以不连续的,也就是说我们的代码只要能够找到给定数组中的最长递增的一组数即可,其实这类题目的本质就是考察动态规划,当前元素之前的最长递增子序列加上当前就是最长递增子序列,这也是整个动态规划的核心,因此,要想搞懂动态规划,必须深刻理解动态方程,理解dp[i]的含义,尤其是当我们拿到一个新题目没有思路的时候,就可以去理解动态方程的含义,然后跟着代码走一遍流程便可以理解这个题解。类似的题目还有很多,动态规划是面试中必考题之一,同时工作中也经常需要用到他们,动态原创 2022-06-14 10:27:46 · 210 阅读 · 0 评论 -
LeetCode——24. 两两交换链表中的节点(三指针)
链表类的题目看似简单,其实不然,有很多链表的题目还是很烧脑的,尤其是光想不去动手画,很多思路只要动手画,很快就知道怎么做的,但是纯在脑子中想很难想明白,因此一定要画图。类似的题目还有很多,例如反转链表,K个一组翻转链表都是面试中的常考题....原创 2022-06-10 12:15:10 · 849 阅读 · 0 评论 -
LeetCode——42. 接雨水(双指针)
接雨水面试必考原创 2022-06-09 09:55:22 · 992 阅读 · 0 评论 -
LeetCode——113. 路径总和 II(DFS)
题目描述解题思路DFS是解决这个问题的核心思路。首先判断传入的节点是否为空,如果为空,则返回空数组。定义DFS函数(节点,某条路径上剩余的和,临时数组)进入DFS函数就让临时数组收录当前节点的值。如果当前节点是叶子节点,并且剩余和与当前的值一致,则将临时数组放入结果数组中。如果左子节点存在就让左子节点,新的剩余和,临时数组的副本进入DFS函数。如果右子节点存在就让右子节点,新的剩余和,临时数组的副本进入DFS函数。AC代码var pathSum = function(root,原创 2022-05-30 18:15:41 · 243 阅读 · 0 评论 -
LeetCode——简化路径(辅助栈)
题目描述解题思路核心的解题思路就是借助一个栈来辅助我们,遇到空字符串和一个点的则跳过,遇到两个点的则出栈。AC代码var simplifyPath = function(path) { // 简化路径的核心就是借助辅助栈 const stack = []; // 分割字符串 const strArr = path.split('/'); // 遇到空字符串和一个点的直接跳过 // 遇到两个点则出栈 const res = [];原创 2022-04-10 07:15:45 · 588 阅读 · 0 评论 -
LeetCode——回文数(反转比较)
题目描述解题思路思路一:反转比较法回文数的一个特点是正着读和倒着读是一样的,那么我们可以定义一个临时变量来存储目标元素的反转,然后顺序比较每个元素是否相等,相等则返回true,反之false。var isPalindrome = function(x) { // 使用反转对比的方法来判断是否是回文数字 x = x.toString(); const temp = x.split('').reverse(); const xArr = x.split(''); for (l原创 2022-04-06 07:36:40 · 283 阅读 · 0 评论 -
LeetCode——二叉搜索树的第k大节点(逆中序+count)
题目描述题目解读题目让我们去查找二叉搜索树的第K大的节点,我们首先要搞懂下面几个问题:RQ:二叉搜索树和普通二叉树的区别在哪里?二叉搜索树的特点是左子节点都比根节点小,右子节点都比根节点大。解题思路根据搜索二叉树的特点,我们可以进行一次逆中序遍历,中序遍历我们都知道是左根右的遍历方法,那么逆中序遍历顾名思义是右根左的遍历方法,这样遍历的好处是和二叉搜索树结合起来了,第一个遍历的右子节点就是第1大的元素,因此我们可以通过计数器的方式,一旦计数器到了K,此时的节点就是第K大的节点。原创 2022-03-06 10:22:39 · 631 阅读 · 0 评论 -
LeetCode——岛屿数量(DFS)
题目描述解题思路岛屿数量是一道经典的DFS问题,要想解决这个问题,首先要搞明白下面的几个问题:RQ1:怎么判断是一个岛屿?并不是有1的地方就是一个岛屿,一个孤立的岛屿其上下左右都是没有1的,这样的岛屿才能算作一个岛屿,这也就是为什么第一个例子中那么多个1才是一个岛屿的原因,请看下面的例子,这个图中有三个岛屿:RQ2:DFS如何解决岛屿的数量问题?第二个问题也就是我们解题的核心,核心思路就一句话假如当前遍历的元素的值是1,就将岛屿数量加1,同时将其上下左右的1都变为0,然后继续循环。原创 2022-03-01 09:59:22 · 873 阅读 · 0 评论 -
LeetCode——买卖股票的时机 II(动态规划)
介绍买卖股票的最佳时机是一道高频考题,这个题目已经衍生出多个版本,其中尤其是买卖股票的最佳时机I和II是面试中的高频考题,让我们来一起看看该如何解决这类问题吧~题目描述解题思路无论是买卖股票的最佳时机I还是II,动态规划都是解决的好方法,动态规划最重要的就是理解动态方程的含义是什么,下面对动态规划的核心进行介绍:dp[i][0]:表示的是第i天,手上没有股票获取的最大收益,也就是说赚的钱数。dp[i][1]:表示的是第i天,手上有股票获取的最大收益。dp[i][0]的可能原创 2022-02-28 08:25:12 · 263 阅读 · 0 评论 -
LeetCode——第一个只出现一次的字符(Map)
题目描述题目主要是让我们找到第一个只出现一次的字符,如果没有并不是返回为空字符串,而是单空格,这个地方容易出错,大家一定要注意。解题思路博主原本想使用set来实现的,出现第二次就将其从set中去除,但是这种方法无法应对出现三次或者五次等奇数的情况。,因此后来采用了最简单的方法map遍历,然后将其次数存储到map的value中,key则是每一个单字符。如果传入的参数是一个空字符串,则染回单空格。初始化一个map,遍历每一个字符,并更新字符出现的次数。遍历map的每一个item,如果it原创 2022-02-22 09:36:33 · 7251 阅读 · 0 评论 -
LeetCode——最长公共子序列(动态规划)
题目描述解题思路动态规划是解决这个题目的方法之一,动态规划之所以能够解决这个问题,关键在于构建dp[i][j],这里的dp[i][j]表示的是第一个字符串从0到i和第二个字符串从0到j之间的最长公共子序列的长度,明白这个含义之后,就方便后续的理解了。假如,我们在比较第一个字符串的第i个元素和第二个字符串的第j个元素的时候,有两种情况:要比较的字符相等dp[i][j] = dp[i-1][j-1] + 1要比较的字符不相等dp[i][j] = Math.max(dp[i-1]原创 2022-02-11 09:02:50 · 732 阅读 · 0 评论 -
LeetCode——下一个排列(降序重排法)
题目描述解题思路第一步:从右往左倒着找看是否有降序元素的存在如果有降序元素的存在则进行标记,可以设置一个变量来帮助我们标记。加入nums[right] > nums[right-1],我们此时要记录这个right-1的位置后续有用,如果没有降序元素的存在,则直接进行升序排列即可,不用再看下面的步骤了,直接返回。第二步:从降序位置往后的所有元素进行一次升序排列第三步:对升序排列的数组进行遍历找到第一个比right元素大的元素,进行交换第四步:交换后进行二次升序排列。AC代码var原创 2022-02-09 08:44:18 · 479 阅读 · 0 评论 -
LeetCode——删除链表的倒数第N个节点(快慢指针)
题目描述解题思路删除链表的倒数第N个结点,有很多种解法,本次我们重点介绍的是快慢指针法,快慢指针在解决链表问题的时候,通常能够快速解决问题,这主要取决于快慢指针的特点。快慢指针为什么能够找到链表的倒数第N个节点假设一个链表有五个节点,我们想要删除倒数第2个节点,我们首先让快指针、从第一个节点的位置触发,走2+1个节点,我们能够发现此时快指针有两种情况,一是走到了null,二是走到了倒数倒数第2个节点,此时我们分情况讨论:快指针走到了null,此时如果还没有走完n + 1个节点让满秩原创 2022-01-29 20:28:20 · 909 阅读 · 0 评论 -
LeetCode——螺旋矩阵(上下左右四指针辅助法)
题目描述解题思路首先定义四个指针,指向如下图所示:按照顺时针进行遍历,分别是从左到右、从上到下、从右到左、从下到上的思路。一轮循环后让左指针+1,继续下一轮循环,需要注意的是每次移动指针的时候,都需要注意指针是否越界。var spiralOrder = function(matrix) { // 螺旋矩阵的核心是使用四个指针来辅助遍历 // 首先是初始条件的判断,如果矩阵的长度为0,则返回空数组 if (matrix.length === 0) return [];原创 2022-01-14 10:09:16 · 321 阅读 · 0 评论 -
LeetCode——删除字符串中的所有相邻重复项(用栈实现打牌思路)
题目描述这道题从题目的名字上看是删除字符串中的所有相邻重复项,其实通俗的讲就是消消乐的思想,有两个相邻一致的则消除,消除一对后如果还有则继续消除。解题思路本题的实现可以使用打牌思路,类似题目有最长回文串,这道题目是使用集合来实现打牌思路,但是本题是通过栈来实现打牌思路,首先遍历每一个字符,如果栈中有元素,且栈的最后一个元素和这个元素的值相等,则栈进行pop,反之push进栈,最后返回栈对应的字符串。var removeDuplicates = function(s) { // 这道题目原创 2022-01-08 21:37:03 · 578 阅读 · 0 评论 -
LeetCode——最小栈(辅助栈)
题目描述解题思路初始化初始化的时候构造一个普通栈和最小栈,这个最小栈的特点在于,只要发现比最后一个元素小的元素。就把这个元素放到最小栈的最后。pushpush元素的时候,普通栈直接入栈,如果入栈的元素比最小栈的最后一个元素小,则这个元素也入最小栈,或者最小栈为空,这个元素也入最小栈。pop首先普通栈pop,如果要pop的元素和最小栈的最后一个元素的值相等,最小栈也要pop。top直接返回普通栈的最后一个元素。getMin直接返回最小栈的最后一个元素。AC代码v原创 2022-01-06 10:31:41 · 3760 阅读 · 0 评论 -
(二刷)LeetCode——最大连续1的个数 III(滑动窗口)
题目描述这道题目和替换后的最长重复字符有异曲同工之妙,建议大家结合着来刷题。解题思路滑动窗口是这道题目的核心解题思想,既然有滑动窗口少不了的是左右指针和最大值。定义一个数组用来存储0和1出现的次数。右指针是核心循环条件,当右指针走到数组的长度的位置的时候,此时结束循环。进入循环后,首先更新右指针指向元素出现的次数,只有指向元素是1的时候,才会更新最大值。这个最大值表示的是1出现的最大次数。当滑动窗口的长度比max + k大的时候,开始移动左指针,同时左右指针对应出原创 2022-01-04 10:04:22 · 3417 阅读 · 0 评论 -
LeetCode——环形链表(快慢指针)
题目描述解题思路环形链表这个题目最容易出现错误的地方就是死循环的问题,所以我们要注意防止出现死循环,关键的思想就在于如果一个链表是环形链表,一个指针走得快,另一个指针走得慢,那么这两个指针一定会相遇,这就是这道题的核心思想,也是判断链表是否有环的关键思想。var hasCycle = function(head) { // 快慢指针是解决环形链表的不二法门 let fast = head; let slow = head; while (fast) { if (fast原创 2022-01-01 10:09:27 · 258 阅读 · 0 评论 -
LeetCode——数组中重复的数据(使用符号表示是否出现过)
题目描述题目核心数组中的元素只出现过一次或者两次。数组中每个元素的值都在1到N之间,其中N为数组的长度。解题不得使用其他的额外空间,必须在nums数组本身上进行操作。解题思路本题的核心解题思路就是使用nums[i]的正负来表示值为i+1的元素是否出现,首次出现将其变为负数,再次出现则将其加入到结果数组中。AC代码 var findDuplicates = function(nums) { const res = []; for (let num of nums) {原创 2021-12-23 10:12:11 · 3603 阅读 · 0 评论 -
LeetCode——实现strStr()(KMP算法)
题目描述实现strStr()这个题目的本质考查KMP算法,也是前端的indexOf这个API的底层实现原理,因此这道题无论是原理上还是从面试角度来看都是非常重要的一道题目。解题思路这道题目想实现的是字符串匹配,即找到目标模式串在母串的位置,如果模式串为空,直接返回下标0,其余情况,返回模式串首次出现的位置。本题最核心的莫过于构建next数组,next数组代表的是模式串的前缀和后缀之间相同元素的个数,这个next数组可以指导后续模式串失配的时候的移动次数。这是kmp算法的核心,至于为什么是这样原创 2021-12-21 09:10:00 · 1155 阅读 · 0 评论 -
LeetCode——搜索插入位置(二分查找)
题目描述解题思路本题的解题思路核心就是二分查找,这道题目是二分查找的经典题目,其解题思路也堪称是二分查找的模板,二分查找的判别就在于题目给的是一个已经排好序的数组,因此本题符合要求。var searchInsert = function(nums, target) { // 搜索插入位置使用的是二分查找的核心模板 function findLeft(nums,target) { let left = 0; let right = nums.length - 1;原创 2021-12-11 10:11:22 · 1761 阅读 · 0 评论 -
LeetCode——组合总和(DFS)
题目描述解题思路DFS是解决这道题的核心思路,DFS函数总共接收三个参数。第一个参数是遍历的起始位置,这个参数存在的意义在于防止重复遍历,只添加这个元素后面的元素,这个元素前面的不再遍历。第二个参数是临时数组,用来记录一次遍历的数组。第三个参数是临时数组内的和。边界条件是如果临时和大于等于target则继续判断,如果等于则存储,不等于则返回。var combinationSum = function(candidates, target) { const res = [];原创 2021-12-07 10:30:58 · 236 阅读 · 0 评论 -
LeetCode——二叉树的最大深度(递归法+层序遍历)
题目描述解题思路二叉树的最大深度的解题方法有很多种,但是我们要做的是使用通用的思路来求解,比如使用层序遍历的方法首先用数组保存整个树的所有节点到数组中,然后返回这个二维数组的长度就是这个二叉树的最大深度,之所以要这样做,是因为我们的解题方法是通用的,这个思路既可以求解这个问题,也可以进行二叉树的遍历。var maxDepth = function(root) { // 使用递归法层序遍历二叉树 if (!root) return 0; let result = []; func原创 2021-12-03 07:54:10 · 2136 阅读 · 0 评论 -
LeetCode——二进制求和(字符串求和法)
题目描述解题思路本题的核心解题思路和字符串相加、两数相加等题目高度类似,都是给出一个字符串,求字符串的和,我们可以从字符串的最后一个字符算起,将一个字符转换为一个数字可以通过减字符0来实现。只要下标大于等于0或者进位不等于0,就进入循环。如果临时和对2取余为0,res则unshift(0),反之unshift(1)。然后根据sum和2的关系,修改进位的值,最后下标减一。var addBinary = function(a, b) { let l = a.length - 1; let r原创 2021-12-02 08:56:24 · 829 阅读 · 0 评论 -
LeetCode——用栈实现队列(入队栈+出队栈)
题目描述解题思路这个题目总共包含五个主要步骤。步骤1:函数初始化在初始化函数的时候,函数的实例身上应该包含两个栈,一个是入队栈,一个是出队栈。var MyQueue = function() { this.pushStack = []; this.popStack = [];};步骤2:模拟入队操作如果队列想要进行入队操作,直接push进入队栈即可。MyQueue.prototype.push = function(x) { this.pushStack.pus原创 2021-12-01 07:57:02 · 666 阅读 · 0 评论 -
LeetCode——在排序数组中查找元素的第一个和最后一个位置(二分查找核心模板)
题目描述解题思路这道题目堪称是二分查找的经典题型,核心题型,模板题型。只要会了这道题目,几乎所有的二分查找的问题都迎刃而解了。定义二分查找中查找左边界的函数,这个函数能够返回左边界的下标,如果数组中有目标元素返回第一个下标,如果数组中的所有元素都小于目标元素,返回的是数组的长度,如果数组中的所有元素都比目标元素大,返回的是下标0,如果数组中没有该元素,但是有比该元素大的值,返回的是第一个比目标值大的下标。如果函数返回的下标对应的值不等于target,则返回[-1,-1].如果存在则返回[f原创 2021-11-27 09:51:47 · 239 阅读 · 0 评论 -
LeetCode——最长回文串(Set + 打牌思路)
题目描述解题思路这道题和最长回文子串有本质不同,这道题相当于给我们一个字符串,让我们根据这个字符串来自己组合最长回文串,我第一次尝试解决这个问题的时候,采用的是Map的思路,但是需要考虑很多种情况,后来看到使用Set+打牌思路的题解,感觉甚是巧妙,特此分享给大家。创建一个Set。遍历每一个字符,如果这个字符出现在了集合中,则将这个字符从集合中删去,并且给sum+2,表示这个字符出现过两次,如果这个字符没有出现在集合中,则将其添加到集合中去。最后判断集合中是否还有元素,有则给结果+1,没有则原创 2021-11-23 07:42:35 · 552 阅读 · 0 评论 -
二刷--从上到下打印二叉树 III(层序递归+反转)
题目描述解题思路实现方式一:递归法进行层序遍历然后根据层次的奇偶进行反转var levelOrder = function (root) { // 核心思路:二叉树的层序遍历--递归实现 if (!root) return []; let result = []; function levelOrder(root,level) { if (!root) return null; result[level] = result[level] || []; re原创 2021-11-20 17:27:31 · 611 阅读 · 0 评论 -
LeetCode——岛屿的最大面积(DFS)
题目描述解题思路本题的核心解题思路是使用DFS,所谓的DFS就是递归加标记,符合条件的元素遍历过后将其标记为已经遍历过,在本题中我们无需使用哈希表进行标记,只需将遍历过的位置变为0即可。定义二维数组的行数,即grid的长度。定义二维数组的列数,即grid[0]的长度。二层循环遍历每一个元素,不断更新最大值。将当前位置和行列数投入DFS函数中,首先进行边界条件的判断,如果不符合则返回0,如果符合则将其标记为0,表示已经遍历过,然后递归上下左右四个方向进行判断。var maxAreaO原创 2021-11-19 07:42:15 · 472 阅读 · 0 评论 -
LeetCode——比较版本号(分割-去零-填零-比较)
题目描述解题思路首先使用split将元素根据标点符号点,进行分割。对数组中的每一个元素进行去零操作,并不是所有的元素都要进行去零操作,只有该元素包含了两个字符或者以上内容的时候,并且该元素的第一个字母是0才需要进行去零操作,其余则不需要去零操作。填0操作:首先比较两个数组的长度,长度较短的数组通过填0操作,补充到相同的长度,这样可以方便后续的比较。比较:定义两个指针,分别指向这两个数组,同时往后遍历,只要比较到大小关系则进行返回对应的值。AC代码var compareVersion =原创 2021-11-16 08:11:15 · 556 阅读 · 0 评论 -
LeetCode——K个一组翻转链表(三指针)
题目描述解题思路首先判断传入的链表的长度是否小于K,如果小于K则返回原链表。如果传入的链表的长度大于等于k,则继续下面的判断。初始化两个指针,prev和cur,prev指针初始的时候为null,cur初始的时候为head指针指向的位置。核心循环:首先保存当前指针的下一个指针,然后让prev前进一个,让cur前进一个,最后将cur指针指向的投入递归,所有递归结束的时候,返回prev。AC代码var reverseKGroup = function(head, k) { // 首先判断传原创 2021-11-08 07:40:18 · 226 阅读 · 0 评论 -
LeetCode——Excel表列名称(进制转换)
题目描述解题思路定义一个存储结果的数组。以输入的数字为循环条件,首先将数字-1,之所以要减1,是因为题目中字母和数字的对应顺序,并不是真正的26进账,通过-1,可以将其装换为26进制。变为26进制之后,数字对26取余,得出的结果+65,然后使用String.fromCharCode转换为对应的字符,每次都放在数组的头部,然后除以26,向下取整即可。将结果数组拼接为字符串。AC代码var convertToTitle = function(columnNumber) { cons原创 2021-11-06 07:45:46 · 256 阅读 · 0 评论 -
LeetCode——合并两个有序数组(双指针)
题目描述解题思路首先使用splice方法,将nums1和nums2指定位置之后的无关元素去除。如果二者其中有一个是空数组,则直接push到nums1中。定义双指针,进行依次比较,小的放到nums1中。判断左右指针谁先走到头的情况。AC代码var merge = function(nums1, m, nums2, n) { nums1.splice(m) nums2.splice(n) if (nums1.length === 0 || nums2.length === 0)原创 2021-10-28 08:41:24 · 683 阅读 · 0 评论 -
LeetCode——二叉树的层序遍历(递归与非递归)
题目描述递归实现递归实现主要是在函数内部定义一个新的函数,这个函数接收两个参数,一个是当前节点,一个是层次,如果当前节点为空的话,则返回空,如果当前节点不为空,判断二维数组的指定位置是否为空,如果存在则push进当前节点的val值,如果不存在则设置为空数组,然后递归遍历左子树,层次+1,递归遍历右子树的时候层次还是+1。var levelOrder = function(root) { // 定义最终的返回结果 const res = []; function levelOrder(原创 2021-10-26 09:07:15 · 2972 阅读 · 0 评论