Skip to content

力扣

约 4532 字大约 15 分钟

2025-09-03

回溯:带有状态的递归 剪枝:回溯中基于约束条件去做选择

动态规划:每一步都是用前面已经算过的结果推出来的

  1. 自上而下的递归+备忘录(重复子问题)
  2. 自下而上的迭代

3. 无重复字符的最长子串 - 力扣(LeetCode)

滑动窗口实现

165. 比较版本号 - 力扣(LeetCode)

切割字符串并转换成数字类型 还可以使用生成器返回迭代器的方式优化性能

88. 合并两个有序数组 - 力扣(LeetCode)

三指针从后往前遍历,避免数据覆盖。

415. 字符串相加 - 力扣(LeetCode)

从后往前遍历字符串,将字符转换成数字相加 也可以在位数不足的前面补上0

20. 有效的括号 - 力扣(LeetCode)

1. 两数之和 - 力扣(LeetCode)

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function (nums, target) {
  for (let i = 0; i < nums.length; ++i) {
    for (let j = i + 1; j < nums.length; ++j) {
      if(nums[i] + nums[j] === target){
        return [i, j];
      }
    }
  }
};

46. 全排列 - 力扣(LeetCode)

回溯:有状态的递归

使用回溯法 递归进行深搜,遍历数字数组,如果当前元素存在于状态数组中表示当前元素已经在结果数组中了就跳过,如果不在就添加入状态数组中,继续递归,当递归出来后将当前元素从状态数组中取出(修改状态)

206. 反转链表 - 力扣(LeetCode)

双指针,在反转时需要构造一个temp做中转

53. 最大子数组和 - 力扣(LeetCode)

每次遍历查看上次的和是否大于0,如果大于0表示此前的和相加是有益的,就相加,否则就将和赋值为当前值,再与保存的最大和比较

102. 二叉树的层序遍历 - 力扣(LeetCode)

每次遍历传递当前层级数,层级数的索引就是自己在二维结果数组中对应的数组

15. 三数之和 - 力扣(LeetCode)

一次遍历+双指针 先排序整个数组,让数组有序,每次遍历在当前值的前一个位置设置一个指针,在数组末尾设置第二个指针,如果值相加大于则右指针前移再比较,如果大于则左指针后移,如果等于则直接添加到结果数组中并两个指针都相向移动一次,再再次循环中循环左指针的值是否小

121. 买卖股票的最佳时机 - 力扣(LeetCode)

记录买入价值,和当前利润 遍历数组,如果当前值比此前的买入价值小则将当前值记录为买入价值,否则的话就尝试卖出,取当前卖出利润和此前的利润的最大值

141. 环形链表 - 力扣(LeetCode)

快慢指针,快指针一次走两步,慢指针一次走异步,如果快指针遇到null则无环,如果遇到慢指针则有环

112. 路径总和 - 力扣(LeetCode)

回溯:带状态的递归 每次递归传递上次的目标值减去当前值,也就是后续节点要达到的目标总值,遇到叶子节点则返回判断

70. 爬楼梯 - 力扣(LeetCode)

类似斐波那契数列,单独递归会栈溢出,需要存储之前的状态 如果台阶等于1只有一种方式,如果等于2则有两种方式,因此初始的f(1)和f(2)的值就可求出 后续的每个台阶所包含的方法就是前一次和前两次所能达到方法的和,也就是满足:f(n)=f(n-1)+f(n-2)

21. 合并两个有序链表 - 力扣(LeetCode)

构建一个虚拟头节点指向新链表,并在两个链表中各设置一个指针,将相对较小的添加到新链表队尾,最后返回虚拟头节点的下一个节点

215. 数组中的第K个最大元素 - 力扣(LeetCode)

将数组排序后取第k个值(索引为k-1)

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
function findKthLargest(nums, k) {
  const temp = nums.sort((a, b) => b - a);
  return temp[k - 1];
}

912. 排序数组 - 力扣(LeetCode)

归并排序符合O(nlogn)

146. LRU 缓存 - 力扣(LeetCode)

使用map做缓存,调用get时如果元素存在就删除后再添加进去

5. 最长回文子串 - 力扣(LeetCode)

每次遍历一个字符就从当前字符开始分别向左右设置一个指针,根据判断是否相等 每次遍历要执行两种情况:i和i+1,因为回文子串有两种:bab、baab

200. 岛屿数量 - 力扣(LeetCode)

双层遍历二维数组,如果遇到值为1的则先加上岛屿数量,接着深搜向四周扩散,如果遇到值为1的则将值置为0表示已经遍历过了,并继续向四周扩散,如果越界或者遇到0则返回。 必须向四周扩散,不能只向右或下,因为深搜是从后往前跳出执行栈的,如果只向左或向右会人为地跳过相连的1,后面再计算岛屿数时污染数据

54. 螺旋矩阵 - 力扣(LeetCode)

在上下左右各设置一个边界,以一定顺序按边界执行,每次循环遍历这个边界上的值,循环结束后缩小边界,直到某个边界与它对应的边界接触后就跳出循环

56. 合并区间 - 力扣(LeetCode)

先将区间数组按照开始区间正序排列 遍历区间数组,判断区间重叠

300. 最长递增子序列 - 力扣(LeetCode)

动态规划,设置一个数组作为每一项前面递增子序列长度,默认值都是1 遍历每一项,对比每一项如果大于前面的某一项则最长子序列长度取当前项子序列长度与该项长度+1的最大值

704. 二分查找 - 力扣(LeetCode)

129. 求根节点到叶节点数字之和 - 力扣(LeetCode)

93. 复原 IP 地址 - 力扣(LeetCode)

三叉决策树结合回溯

322. 零钱兑换 - 力扣(LeetCode)

回溯超时,需要使用自上而下的动态规划,设置一个dp数组,对每一项索引为i的值任取一枚面值为coin的硬币均符合dp[i-coin],后面的每一项都利用前一步的计算结果

function coinChange(coins: number[], amount: number): number {
  const dp = new Array(amount + 1).fill(amount + 1)
  dp[0] = 0

  for (let i = 1; i <= amount + 1; ++i) {
    for (const coin of coins) {
      if (coin <= i) {
        dp[i] = Math.min(dp[i], dp[i - coin] + 1)
      }
    }
  }

  return dp[amount] == amount + 1 ? -1 : dp[amount]
};

22. 括号生成 - 力扣(LeetCode)

直接全部变量并对每一项进行括号合法判断超时 使用剪枝回溯,当左括号数量小于组数n时就可以添加左括号,当右括号小于左括号数时才可添加右括号,选择性的生成

LCR 140. 训练计划 II

快慢指针,让慢指针落后cnt位,当快指针为null时慢指针达到倒数第cnt位

104. 二叉树的最大深度 - 力扣(LeetCode)

function maxDepth(root: TreeNode | null): number {
  let res = 0
  function dfs(node: TreeNode | null, deep: number) {
    if (!node) {
      res = Math.max(res, deep)
      return
    }
    dfs(node.left,deep+1)
    dfs(node.right,deep+1)
  }
  dfs(root,0)
  return res
};

不使用递归需要借助一个栈存储节点实现

LCR 126. 斐波那契数 - 力扣(LeetCode)

直接递归会导致重复计算过长超时,需要对之前的结果进行缓存

695. 岛屿的最大面积 - 力扣(LeetCode)

解法和岛屿数量相似

42. 接雨水 - 力扣(LeetCode)

对任意一个位置,它可以承载的水量等于它左边最高和右边最高中取最小值减去它本身的高度

1143. 最长公共子序列 - 力扣(LeetCode)

二维动态规划 dp表行数是第一个字符串的长度+1,列数是第二个字符串的长度+1,第0行和第0列的值都为0表示空字符串的情况,表格中dp[i][j]代表第一个字符的前i个字符和第二个字符串的前j个字符的最长公共子序列长度。如果s1[i]===s2[j]dp[i][j]赋值为dp[i-1][j-1]+1也就是它左上角各自最长公共子序列长度+1表示发现了新的匹配字符,如果不想等则dp[i][j]赋值为max(dp[i-1][j],dp[i][j-1])去左边或上边的最大值表示跳过当前字符,依次把整张表填完,结果即为dp表右下角的值

贡献者

PinkDopeyBug

公告

本博客内容原本使用obsidian编写,由于没有仔细配置,以至图片引用使用obsidian风格。

且图片存储路径频繁变更导致部分文章图片无法正常显示。

为您带来不便请谅解。

ps:贡献者一直都只有wynnsimon一人,显示Pink的贡献者是因为我没好好配置git。后面因为懒就没一个个修改。如果被提及的人不希望被显示可以联系我我会立即删除。