力扣算法题
文章平均质量分 57
foolBirdd
菜鸟实录
展开
-
【近日力扣】(二分法合集2) 猜数字大小+在排序数组中查找元素的第一个和最后一个位置+搜索二维矩阵+稀疏数组搜索+寻找旋转排序数组中的最小值+山脉数组的峰顶索引
猜数字大小(简单)常规做法思路一:递归var guessNumber = function(n) { if (!guess(n)) return n let recursion = (l, r) => { let mid = Math.floor((r + l) / 2) if (guess(mid) === -1) { return recursion(l, mid) } else if (gues原创 2022-02-28 14:58:42 · 174 阅读 · 0 评论 -
【近日力扣】单词拆分+合并区间+链表排序+调整数组顺序使奇数位于偶数前面
单词拆分(中等)动态规划”leetcode“ 是否可被组成,可分解成——步长为 1 时,“l” 是否存于字典且后续子串可被组成,等等;步长为 2 时,“le” 是否存于字典且后续子串可被组成,等等;步长为 3 时,“lee” 是否存于字典且后续子串可被组成,等等以此类推,设dp[i]表示s[0, i]的字符串是否可被组成,设j为当前步长,若要dp[i]为真,则需dp[j]为真且s[j, i - j]存在字典中,由此推出递推式:dp[i] = dp[j] && isTrue(s[j,原创 2022-02-20 10:54:03 · 224 阅读 · 0 评论 -
归并算法迭代版本的探索(Javascript 版)
众所周知,归并算法主要有两种方法实现,递归、迭代(插一句,一般递归都可用迭代实现),且时间复杂度都是O(nlog(n)),递归网上版本较多,简单提一嘴,主要是讲解迭代的 JS 实现归并算法思路看一张《学习JavaScript数据结构与算法(第3版)》的图就一目了然了,先将数组拆分为小数组,再排序并合并回去,一看到此图自然就会联想到递归方法了,这正是递归调用栈的步骤展示递归版优缺点:递归一般优点是代码量少,缺点是较抽象、调用栈较大思路:通过递归去拆分数组,通过merge函数去合并子数组.原创 2022-01-27 17:01:27 · 1015 阅读 · 0 评论 -
【近日力扣】(链表合集2)删除链表的倒数第n个节点+相交链表+移除链表元素+合并两个排序的链表
一路摸索下来发现,链表题常规的解题方法有递归、迭代两种,可以优先考虑删除链表的倒数第n个节点(简单)思路:首先得确定第 n 个节点在哪,先遍历出链表长度;然后长度和 n 相减,找到正数第几个节点,再次遍历,跳过那个节点即可。还要分三种情况——删除第一个节点、删除中间节点、删除末尾节点,会发现只有第一种需要另外考虑,若要删除第一个节点则直接返回第二个节点即可var removeNthFromEnd = function(head, n) { let cur = head, sum = 0.原创 2022-01-09 22:28:56 · 386 阅读 · 0 评论 -
【近日力扣】零钱兑换+零钱兑换||+礼物的最大价值+三角形最短路径和+打家劫舍+打家劫舍||
动态规划专题(一)动态规划题目比较千变万化,我也没有那么多时间去研究所有可能,挑着一些典型的题型刷刷。解题思路的重点就是找到状态转移的过程零钱兑换(中等)背包问题思路一:求兑换最少次数。用dp[i]记录兑换i元需要的次数,那么它的上一个状态就是dp[i-j],j代表第j位零钱的面值,由此可得转移方程dp[i]=Min dp[i-j] + 1,因为兑换i元的状态都是由上一状态i-j推算而来,所以得找出消耗次数最少的上一状态,同时得加一才能到达i状态var coinChange = fu.原创 2021-11-19 11:36:44 · 233 阅读 · 0 评论 -
【近日力扣】颜色填充+岛屿数量+水域大小+打开键盘锁+单词搜索+课程表
1.DFS(深度优先搜索)和 BFS(广度优先搜索)合集。2.两者区别主要在于——前者维护一个栈的数据结构,所以通常可以使用递归的方法;后者维护一个队列的数据结构,通常使用循环迭代的方法。3.同时前者用递归实现的话,只需要考虑递归的形式和结束递归的条件,电脑自己在维护栈,比较方便、易懂,后者需要自己写迭代去维护队列,相对来说上手比较复杂4.如果回溯和递归都很熟悉了,DFS 就很好上手了,下文也就不多解释了颜色填充(简单)思路:DFS,关注边界条件和特殊情况,然后上下左右四个方向依次搜索(填充.原创 2021-10-23 18:13:32 · 172 阅读 · 0 评论 -
【近日力扣】组合+子集 ||+组合总和
回溯算法合集。要注意“回退步骤”,比如往数组里添加一个数,然后递归,则递归完要将该数再删除,才能实现原路径返回(回溯)回溯是一种算法思想,可以用递归实现组合(中等)思路:递归。维护一个子数组 path,首先存入一个数,作为开始数,后续存入的每一个数都做放入和不放入 path 的处理,找到所有的结果,每当 path 的长度等于 k 的时候就将 path 存入目标数组,然后再更改开始数,如此反复var combine = function(n, k) { if (n < k) re.原创 2021-10-17 14:00:56 · 61 阅读 · 0 评论 -
【近日力扣】二叉树的最近公共祖先+ 二叉搜索树的最近公共祖先+二叉树展开为链表+BiNode
二叉树专题(二),二叉树深入思考二叉树的最近公共祖先(中等)思路:递归。分两种情况——第一,p、q 分别在某节点的左右子树中;第二,p、q 中有一个自己本身就是两者的最近公共祖先,另一个在该节点的子树中。这个过程,通过递归判定 p、q 节点分别在哪两个子树上,且递归是维护的栈数据结构,由根节点开始入栈,叶子节点出栈,所以最先出栈的公共祖先就是最近的var lowestCommonAncestor = function(root, p, q) { let ans let dfs .原创 2021-10-10 21:03:30 · 86 阅读 · 0 评论 -
【近日力扣】 二叉树的前/中/后序遍历+N 叉树的前序/后序遍历+二叉树/N 叉树的层序遍历+二叉树/N 叉树的最大深度
二叉树专题(一)。通用的两种方法——递归和迭代,迭代一定得搞懂,有的题递归搞不定或者很麻烦二叉树的前/中/后序遍历(简单)思路:递归。const postorderTraversal = (root) => { if (!root) return [] let arr = [] let ergodic = (root) => { if (root ===null) return // 改变该语句位置即可 arr.原创 2021-10-06 13:58:31 · 90 阅读 · 0 评论 -
【近日力扣】(二分法合集1)二分查找+搜索插入位置+寻找峰值+搜索旋转排序数组
二分查找专题二分查找(简单)标准二分解法,迭代法和递归法思路一:迭代法,需要左、右两个指针。解题注意跳出循环的条件,和返回值(比如可以返回左、右边界值,或中间值)var search = function(nums, target) { let left = 0, right = nums.length - 1 // 左指针在右指针左边 while (left <= right) { let mid = Math.floor((left + .原创 2021-10-01 21:36:51 · 130 阅读 · 0 评论 -
【近日力扣】有效的字母异位词+数组中重复的数字+交换和+数组的相对排序
哈希表合集,哈希表不一定非要用 map 对象实现,有时数组也可有效的字母异位词(简单)思路一:直接用 api,转换为数组再排序再转换为字符串var isAnagram = function(s, t) { s = s.split("").sort().join("") t = t.split("").sort().join("") return s === t};思路二:哈希表,map 对象。遍历 s 将字符以及对应的数量存入 map 表(例如 “s”: “2”.原创 2021-09-20 11:15:16 · 102 阅读 · 0 评论 -
【近日力扣】(递归合集)子集+递归乘法+数值的整数次方
递归合集,当无法思考出调用栈的所有情况时,可以忽略,找出对应递归公式和终止条件即可子集(中等)思路一:迭代。用二进制依次递增1的规律模拟从集合里取元素的过程,以集合 [1, 2 ,3] 举例,见下表二进制数子集000[]001[1]010[2]011[1, 2]100[3]101[1, 3]110[2, 3]111[1, 2, 3]用位运算模拟该过程var subsets = function(nums).原创 2021-09-13 23:18:49 · 94 阅读 · 0 评论 -
【近日力扣】栈排序+最小栈+用队列实现栈
JS 对太友好了,如果想体会原汁原味的栈(先进后出),那就不要在栈底操作元素,比如使用shift()方法,而且排序也不要调用 API排序栈(中等)思路:辅助栈每次要取最小元素,那意味着在取的时候排序?思考一会便知道不现实——题目要求顶多两个栈,如果存数据的栈里面是乱序,至少得三个栈才能完成排序所以可以计划在存数据时就进行排序,你会发现两个栈足够了。每当存入一个数val,就与栈顶的数top做比较,如果val大,就把top取出放入辅助栈,如果val小,就直接存入(维持最小值在栈顶)最后一步在把.原创 2021-09-05 23:15:07 · 134 阅读 · 0 评论 -
【近日力扣】(链表合集1)移除链表元素+反转链表+链表的中间结点+删除排序链表中的重复元素
链表专题给出链表定义/** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } */移除链表元素思路一:遍历链表,找到对应的节点删除,但是要注意头结点的判断,可以再创一个空链表,其下一节点指向目标.原创 2021-08-29 16:19:14 · 86 阅读 · 0 评论 -
【近日力扣】二进制中1的个数+扑克牌中的顺子+IP 地址无效化+把字符串转换成整数+跳水板
二进制中1的个数(简单)位运算需要熟练思路1:用 n 和 1做位运算与然后左移去除 n 的末位,结果为真则计数器加一思路2:借助 n & n-1 去掉最低位 1 的特性,去掉一次就计数器加一,直到 n 为零var hammingWeight = function(n) { let sum = 0 // for (let i = 0; i < 32; i++) { // if (n & (1 << i)) sum++ /原创 2021-08-23 21:14:27 · 144 阅读 · 0 评论 -
【近日力扣】矩阵中的路径+二进制中1的个数+比较版本号+旋转数组的最小数字
矩阵中的路径(中等)DFS 深度优先搜索var exist = function(board, word) { // dfs 深度优先搜索矩阵 let dfs = (board, word, i, j, k) => { // 如果 i j 超出或不在矩阵里,或二维数组元素不等于word中的字母,则返回 false if (i >= board.length || i < 0 || j >= board[0].length || j <原创 2021-08-15 22:01:48 · 102 阅读 · 0 评论 -
【近日力扣】斐波那契数列+用两个栈实现队列+从尾到头打印链表
斐波那契数列(简单)动态规划var fib = function(n) { if (n === 0 || n === 1) return n let n1 = 0, n2 = 1, res = 0 for (let i = 1; i < n; i++) { res = (n1 + n2) % 1000000007 n1 = n2 n2 = res } return res};用两个栈实现队列(简单)原创 2021-08-07 16:48:17 · 236 阅读 · 0 评论 -
【近日力扣】(位运算合集)不用加减乘除做加法+只出现一次的数字+只出现一次的数字 II+只出现一次的数字 III
不用加减乘除做加法(简单)写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。只出现一次的数字(简单)给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?...原创 2021-07-08 11:04:08 · 113 阅读 · 0 评论 -
【近日力扣】验证二叉搜索树+将有序数组转换为二叉搜索树
总结:遇到树的题,可以先思考用哪种遍历方法,感觉遍历是常规解法给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。思路:...原创 2021-07-03 01:05:01 · 87 阅读 · 0 评论 -
【近日力扣】重复的子字符串
重复的子字符串(字符串,简单)给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。思路一(不推荐):枚举,将所有长度的子字符串 s 都列出来,挨个在原字符串 n 里遍历,看是否一直重复到末尾。稍微可以优化的两个点:能重复的 s 长度一定小于 n 的一半;只有长度能被 n 整除的 s 才实现重复var repeatedSubstringPattern = function(s) { let n = s.length原创 2021-06-18 22:11:10 · 147 阅读 · 0 评论 -
【近日力扣 】两数之和+相同的树
两数之和(链表,中等)给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。立马想到了之前做过的简单题——字符串相加。思路就是同位相加,大于10进位,但是这个题要返回链表这种数据结构,所以多了些步骤进行链表转换,且题目给了 ListNode 方法,可以直接 new 出一个链表var addTwoNumbers = f原创 2021-06-15 00:26:43 · 101 阅读 · 3 评论 -
【今日力扣】javascript 字符串排列
给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。换句话说,第一个字符串的排列之一是第二个字符串的子串。初始思路:列出s1全排列(递归),判断是否是s2子串,超时只展示全排列部分,判断是否是子串用includes方法+循环/*递归思路:*例如输入字符串'bcd',先取出b,然后是c,直到最后一位d,将c插入0d0的*为0的位置,得到cd、dc;将b插入0c0d0、0d0c0为0的位置,得到bcd、cbd、*cdb和bdc、dbc、dcb;以此类推。显然,字符串一原创 2020-12-18 11:19:22 · 420 阅读 · 0 评论