这种方式会使得超出的元素隐藏,对行内元素无效,必须是块级元素,隐藏之后元素依然占据着位
这种方式会使得超出的元素隐藏,对行内元素无效,必须是块级元素,隐藏之后元素依然
复杂链表的复制看起来挺难的,但是实际上只要能够想到通过map这个数据结构来辅助我们进行复制,便可以极大的降低问题的复杂度,假如不借助map,直接在链表本身进行操作的话,我们不仅要考虑next指针还要考虑random指针,困难程度可想而知,所以能否想到借助map是本题的破题核心。...
二叉树镜像和反转二叉树是一个题目,总的来说通过BFS可以高效的解决这个问题。
链表类的题目看似简单,其实不然,有很多链表的题目还是很烧脑的,尤其是光想不去动手画,很多思路只要动手画,很快就知道怎么做的
接雨水面试必考
题目描述解题思路岛屿数量是一道经典的DFS问题,要想解决这个问题,首先要搞明白下面的几个问题:RQ1:怎么判断是一个岛屿?并不是有1的地方就是一个岛屿,一个孤立的岛屿其上下左右都是没有1的,这样的岛屿才能算作一个岛屿,这也就是为什么第一个例子中那么多个1才是一个岛屿的原因,请看下面的例子,这个图中有三个岛屿:RQ2:DFS如何解决岛屿的数量问题?
题目描述解题思路这道题属于二叉树考查深度的问题本题的核心在于知道二叉树的深度怎么求:二叉树的深度 = 左子树的深度与右子树的深度中的最大值 + 1,这是核心解题点解题代码var isBalanced = function(root) { let flag = true; dfs(root); return flag; function dfs(root) { if (!root) return 0; let l = dfs(ro
题目描述解题思路这道题属于考查位运算的问题位运算从某种程度上来说思路较为难以理解本题考查的就是加法 = 进位 + 非进位解题代码var add = function(a, b) { while (b) { let c = (a&b) << 1; a = a^b; b = c; } return a;};总结(本题给我们的启示思路)思路一:位运算是如何完成加法操作的。思路二:位运算的加法
题目描述解题思路这道题属于二叉树的问题本题的核心在于通过层次遍历,来将一层的元素的值和这一层元素进行反转之后,相同下标的元素是否相同,只要相同,则说明是对称二叉树,反之则不是对称二叉树。解题代码var isSymmetric = function(root) { if (!root) return true; let flag = true; let queue = [root]; while (queue.length !== 0) {
题目描述解题思路遇到这道题,我首先使用使用双指针,左右遍历遇到第i个元素则停止遍历,然后进行求乘积但是结果超时最终通过对称遍历的方式成功解决问题解题代码一:暴力双指针(超时)var constructArr = function (a) { // 使用左右指针两边遍历的方法 const result = []; let l = 0; let r = a.length - 1; let temp = 1; let temp2 = 1;
题目描述解题思路这道题属于考查排序的问题我们只需要将输入的整数数组按照升序进行排列然后返回前k个数字即可,这里采用JS自带的sort方法截取前k个数字采用slice方法解题代码var getLeastNumbers = function(arr, k) { arr.sort((num1,num2) => num1 - num2); return arr.slice(0,k)};总结(本题给我们的启示思路)启示一:学会使用slice进行截取启示二:学会使用
题目描述解题思路我刚开始看到本题,首先想到的是暴力解法,也就是通过for循环进行不断遍历,结果超时。看了题解才知道,解决逆序对的问题,往往通过归并排序本题考查的本质还是归并排序,只是在归并排序的基础上,增加了一行代码而已。归并排序使用的是分治法的思想,本题就是建立在还是合并的时候,进行统计计算,最终求出结果。解题代码一(暴力法:超时)var reversePairs = function(nums) { let flag = 0; for (let i = 0; i &l
题目描述解题思路这道题在JS题解中一般给出了两种解法,一是动态规划,二是贪心算法本次采用的是动态规划,主要是想强化自己在这方面的学习贪心的思想是构造3,尽可能多的3相乘会使得乘积最大,通过对3取余的三种情况来分别推导最后的乘积动态规划的思想则是首先构造一个长度为n+1的全1数组,这里的n代表的是绳子的总长度,之所以要进行+1,是因为我们操作的始终是数组的下标,dp[i]代表什么含义,是我们必须要好好理解的,dp[i]代表的是长度为i的绳子被剪成n段后的最大乘积动态规划的结束条件是dp[2]=
题目描述解题思路这道题属于栈的相关问题本题的核心思路是采用模拟栈的方法模拟栈是一种很重要的思路,主要是定义两个数组,一个数组和真实的栈的pushpop方法一致,另一个数组则是用来存储最小值的栈,只有push的元素比最小值栈小或相等的时候,才将该元素push进最小值栈。top方法只需将真实栈的栈顶元素返回即可在进行pop方法的时候,真实栈直接pop即可,最小值栈则要判断是否pop的是自己的栈顶,是则pop,不是则不用pop解题代码var MinStack = function () {
题目描述解题思路这道题属于考查二分查找本题如果直接采用JS中自带的排序肯定是要超时的,要不然LeetCode也不会将这道题归为困难二分查找的思路定义两个指针,一个指针指向的是数组元素的第一个下标,另一个指针指向的是数组元素的最后一个元素的下标。中位数下标指的是通过四舍五入的方法,左边指针的下标 + 右边指针的下标 / 2然后进行四舍五入,得到的就是中位数下标如果要添加的值大于中位数下标对应的值,左边的指针移动到中位数指针+1的位置。如果要添加的值小于中位数下标对应的值,右边的指针移动到中位数
题目描述解题思路本题的思想在于想到模拟栈我们首先定义一个数组用来模拟栈从pushed数组的第一个元素开始进行入栈,如果该元素在popped数组的第一个元素,我们就将入栈的元素出栈,然后继续判断栈顶元素是否和popped数组指针指向的元素相同,相同则出栈。如果最后模拟栈的元素个数为零,则说明是栈的压入和弹出序列,反之则不是。解题代码var validateStackSequences = function (pushed, popped) { // 本题使用模拟栈的写法
题目描述解题思路这道题属于二叉树的层次遍历问题首先定义三个数组数组queue用来存放当前层的所有元素指针数组temp充当临时数组,用来存放当前元素所有指针的左右孩子指针数组test用来存放每一层元素的值当test存储完一层的元素后,就将queue置为空,然后遍历temp将每个元素的左右孩子节点继续放入queue,继续下次循环解题代码var levelOrder = function (root) { // 使用队列的方式进行二叉树的层次遍历 if (root ===
题目描述解题思路本题的思想在于想到动态规划首先定义一个和nums同纬度的数组dp数组的第一个元素和nums的第一个元素的值相同这里的dp[i]的含义是解题关键:代表着当前元素在内的所有前面的子数组的和的最大值从nums的第二个元素开始遍历,如果dp[i-1]>0,dp[i]则等于dp[i-1]+nums[i],反之则等于nums[i]解题代码var maxSubArray = function (nums) { // 本题核心是:动态规划的思想 // dp[i]:
题目描述解题思路首先想到了使用DFS进行全排列,然后使用sort进行排序,发现超时,所以全排列DFS的方法行不通。最后还是通过JS自带的sort函数进行比较a+b和b+a来进行排序,最终通过了AC解题代码var minNumber = function(nums) { for (let i = 0; i < nums.length;i++) { nums[i] = String(nums[i]) } nums.sort((num1,nu
题目描述解题思路这道题属于考查DFS(深度优先遍历)*和本道题几乎完全一样的有全排列问题,都是在考查DFSDFS的本质就是递归本题通过设置一个和字符串长度一致的一维数组,用来表示该元素是否被遍历过,初始值全为false表示都没有被遍历过当dfs收到的参数的长度和输入s的长度一致时,说明一条路径已经遍历完了,然后开始存储并返回解题代码var permutation = function(s) { const trace = []; const res = [];
题目描述解题思路本题采用的是通过零数组来辅助判断是否是顺子具体的过程,代码注释中都有解题代码var isStraight = function (nums) { // 将nums数组中所有0元素放入下面的数组中 const zeroArr = []; // 将数组从小到大进行排序 nums.sort((num1, num2) => num1 - num2); // 将含零的元素添加到0的数组中 for (let i = 0; i <
题目描述 解题思路首先定义一个数组用来存储当天之后股票的价格-今天的价格的最大值遍历每一个元素的同时,取出剩余元素使用JS自带的sort方法,将剩余元素的最大值取出来,然后存到结果数组中使用sort方法将结果数组中的最大值进行返回即可 解题代码var maxProfit = function (prices) { if (prices.length === 0) return 0;
题目描述解题思路本题可以通过递归的形式进行解决,也可以采用动态规划核心就在于理解题意
题目描述解题思路使用二叉树的中序遍历,将每一个节点存到一个数组中使用for循环改变每个节点的left,right指针域实现代码var treeToDoublyList = function (root) { const temp = []; function dfs(root) { if (!root) return null; dfs(root.left); temp.push(root) dfs(root.
题目描述解题思路(序列化)本题分为两个部分:一是序列化二叉树,二是反序列化二叉树。序列化二叉树:将以可二叉树,变成一个字符串,这个字符串本人刚开始以为是按照题目给的例子得是层序遍历才行,后来看了题解才知道,原来前序遍历也可以,下面的解法是采用的层序遍历,层序遍历使用的是数组存储每一层的下一层元素,然后将这个数组变成循环的条件,知道数组为空序列化代码const serialize = (root) => { if (!root) return []; let queue
题目描述解题思路使用双指针一个指针指向最左端一个指针指向最右端大了最右端的往左移小了最左端的往右移实现代码var twoSum = function (nums, target) { let l = 0; let r = nums.length-1; while (nums[l] + nums[r] !== target) { if (nums[l] + nums[r] < target) { l++;
题目描述解题思路本题关键点在于:使用递归的思想。考虑两种情况:1. 单个的数字(可以翻译) 2.连续的两个数字组成的数字在0-25之间。(可以翻译)递归的结束条件是字符串的长度达到了输入数字的长度千言万语其实就是下面这个图的思想(来自于LeetCode题解: https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/solution/shou-hui-tu-jie-dfsdi-gui-ji-yi-hua-d
题目描述解题思路本题关键点在于:二叉搜索树的后序遍历序列的最后一个元素是根节点,左子树均小于根节点,右子树均大于根节点使用递归是本题的解题方法本题需要额外考虑的情况在于有的序列是没有右子树的,如果没有右子树,那么分割左右子树的位置就是根节点所在的位置,默认右子树是一个空数组解题代码var verifyPostorder = function(postorder) { // !本题的解题关键:二叉搜索树的后序遍历,最后一个元素是根节点 // 如果输入的数组长度小于2,则返回t
题目描述解题思路本题采用的是模拟队列的思想难点:在于push的时候,要确保模拟队列中保持一个降序的顺序,头部始终是最大值,新加入的value放到最后面,所有比value小的pop掉最后返回模拟队列的头元素,就是最大值解题代码(模拟队列)var MaxQueue = function() { this.queue = []; this.stack = [];};MaxQueue.prototype.max_value = function() { if (thi
Copyright © 2005-2023 51CTO.COM 版权所有 京ICP证060544号