Skip to content

力扣2

约 1721 字大约 6 分钟

2026-02-25

排序后只比较第一个和最后一个字符串,因为默认按字典排序,它们的差异最大只需要比较它们即可,会有额外的空间开销,也可以手动对比,但性能开销更大

function longestCommonPrefix(strs: string[]): string {
  if (strs.length == 0) return ''
  if (strs.length == 1) return strs[0]

  let i = 0
  strs.sort()
  const start = strs[0]
  const end = strs[strs.length - 1]

  for (; i < start.length && start[i] == end[i]; i++) { }
  return strs[0].slice(0, i)
};

226. 翻转二叉树 - 力扣(LeetCode)

function invertTree(root: TreeNode | null): TreeNode | null {
  if (!root) return null
  invertTree(root.left)
  invertTree(root.right)
  const temp = root.left
  root.left = root.right
  root.right = temp

  return root
};

1556. 千位分隔数 - 力扣(LeetCode)

function thousandSeparator(n: number): string {
  const temp = String(n)
  let res = ''
  for (let i = temp.length; i > 0; i -= 3) {
    const str = temp.slice(i - 3 < 0 ? 0 : i - 3, i)
    res = str + '.' + res
  }
  return res.slice(0, res.length - 1)
};

62. 不同路径 - 力扣(LeetCode)

直接深搜时间过长会超时 需要使用二维动态规划,每一格的路径个数等于它左边一格和上边一个路径个数之和

function uniquePaths(m: number, n: number): number {
  const dp = []
  for (let i = 0; i < m; ++i) {
    dp.push(new Array(n).fill(1))
  }
  for (let i = 1; i < m; ++i) {
    for (let j = 1; j < n; ++j) {
      dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
    }
  }
  return dp[m - 1][n - 1]
};

283. 移动零 - 力扣(LeetCode)

function moveZeroes(nums: number[]): void {
  for (let i = 0; i < nums.length; ++i) {
    if (nums[i] === 0) {
      for (let j = i + 1; j < nums.length; ++j) {
        if (nums[j] !== 0) {
          nums[i] = nums[j]
          nums[j] = 0
          break
        }
      }
    }
  }
};

236. 二叉树的最近公共祖先 - 力扣(LeetCode)

先利用深搜遍历节点,存储下根节点到p和q的路径,接着遍历两个数组,相同就记录,不同就跳出

103. 二叉树的锯齿形层序遍历 - 力扣(LeetCode)

层序遍历,适时反转

2. 两数相加 - 力扣(LeetCode)

209. 长度最小的子数组 - 力扣(LeetCode)

滑动窗口

function minSubArrayLen(target: number, nums: number[]): number {
  let res = nums.length + 1, sum = 0, left = 0, right = 0
  for (; right < nums.length; ++right) {
    sum += nums[right]
    while (sum >= target) {
      res = Math.min(res, right - left + 1)
      sum -= nums[left]
      ++left
    }
  }
  return res === nums.length + 1 ? 0 : res
};

394. 字符串解码 - 力扣(LeetCode)

单调栈

101. 对称二叉树 - 力扣(LeetCode)

层序遍历判断

155. 最小栈 - 力扣(LeetCode)

两个栈,第一个栈正常存储元素,第二个栈存储第一个栈每一位对应最小的元素,如:stack1=[-3,0,-2] stack2=[-3,-2,-2]

199. 二叉树的右视图 - 力扣(LeetCode)

将二叉树层序遍历后取每一层(数组)最右(后)的值

198. 打家劫舍 - 力扣(LeetCode)

动态规划 到每间房子可以选择偷当前房子的收益加上前第二间房的收益,也可以选择不偷当前房子偷前一间房子 从第二间可以就可以比较偷当前房子收益大还是偷前一间房子收益大 状态转移方程:Math.max(dp[i - 1], dp[i - 2] + dp[i])

function rob(nums: number[]): number {
  if (nums.length == 1) return nums[0]
  const dp = Array.from(nums)
  dp[1] = Math.max(dp[0], dp[1])
  for (let i = 2; i < nums.length; ++i) {
    dp[i] = Math.max(dp[i - 1], dp[i - 2] + dp[i])
  }
  return dp[dp.length - 1]
};

160. 相交链表 - 力扣(LeetCode)

可以遍历两个链表并将它们的节点记录到两个数组中,再将数组从后往前遍历直到遇到不相等的节点,但时间复杂度和空间复杂度都是O(m+n) 另一个思路是设置两个指针从前往后遍历,第一个链表的指针走到末尾时将指针指向第二个链表的头,第二个链表的指针走到末尾时将指针指向第一个链表的头。这样遍历两次后它们的走过的路径就相等了,判断它们是否相等即可

718. 最长重复子数组 - 力扣(LeetCode)

二维动态规划 设置一个二维数组,双层循环,如果nums1[i] === nums2[j]则表示两个数组中找到了公共数,再判断公共数的dp[i - 1][j - 1]公共数长度,在当前+1,对角线相连即为连续的数组。记录dp中的最大值就是最长重复子数组长度 状态转移方程:dp[i][j] = (dp[i - 1]?.[j - 1] || 0) + 1

125. 验证回文串 - 力扣(LeetCode)

前后双指针,遇到特殊字符跳过 也可以将字符串特殊字符去除获得一个数组再判断,但时间和空间复杂度都是on

贡献者

PinkDopeyBug

公告

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

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

为您带来不便请谅解。

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