动态规划✅
因数分解
如下,实现 calc
方法,可以将输入的数拆解为尽可能多的乘数,所有数相乘等于输入数。
/**
* @param {number} n 乘积
* @return {Array} 拆解后的乘数
* input: 7
* output: [7]
* input: 8
* output: [2, 2, 2]
* input: 24
* output: [2, 2, 2, 3]
*/
function calc (n) { }
爬楼梯
/**
* 爬楼 n 阶你, 每次可以爬 1 或 2 个台阶。有多少种不同的方法可以爬到楼顶
* 输入:2
* 输出:2
* 1. 1 步 + 1 步
* 2. 2 步
* 输入:3
* 输出:3
* 1. 1 步 + 1 步 + 1 步
* 2. 1 步 + 2 步
* 3. 2 步 + 1 步
*/
function climbStairs (n) {
}
答案
Tests
斐波那契数列
/**
* 斐波那契数列
* 输入:n = 5
* 输出:5
* 解释:斐波那契数列为 0, 1, 1, 2, 3, 5, 8, ...
*/
function fibonacci (n) {
}
答案
Tests
最长递增子序列
/**
* 最长递增子序列
* 输入:[10,9,2,5,3,7,101,18]
* 输出:4
* 解释:最长上升子序列是 [2,3,7,101],长度为 4
*/
function lengthOfLIS (nums) {
}
答案
Tests
延伸阅读
在 Vue 等框架的 diff 算法中,也会使用最长递增子序列来优化 diff 逻辑。其中 Vue 的最长递增子序列源码如下 getSequence
编辑距离
/**
* 编辑距离
* 输入:word1 = "horse", word2 = "ros"
* 输出:3
* 解释:
* horse -> rorse (将 'h' 替换为 'r')
* rorse -> rose (删除 'r')
* rose -> ros (删除 'e')
*/
function minDistance (word1, word2) {
}
答案
Tests
背包问题
/**
* 背包问题
* 输入:weights = [2, 3, 4, 5], values = [3, 4, 5, 6], capacity = 5
* 输出:7
* 解释:选择物品 1 (重量 2, 价值 3) 和物品 2 (重量 3, 价值 4),总价值 7
*/
function knapsack (weights, values, capacity) {
}
答案
Tests
路径规划
/*
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。
问总共有多少条不同的路径?
输入:m = 3, n = 7
输出:28
*/
function uniquePaths (m, n) {
}
200. 岛屿数量**
- 难度:中等
- 考点:DFS、BFS
- 应用场景:图形处理、连通性问题
dfs
function numIslands (grid: string[][]): number {
if (grid.length === 0) return 0
const rows = grid.length
const cols = grid[0].length
let count = 0
// DFS遍历整个岛屿并标记
const dfs = (row: number, col: number) => {
// 边界检查或已访问(水域)
if (row < 0 || row >= rows || col < 0 || col >= cols || grid[row][col] === '0') {
return
}
grid[row][col] = '0'
// 四个方向DFS
dfs(row - 1, col) // 上
dfs(row + 1, col) // 下
dfs(row, col - 1) // 左
dfs(row, col + 1) // 右
}
// 遍历网格
for (let row = 0; row < rows; row++) {
for (let col = 0; col < cols; col++) {
if (grid[row][col] === '1') {
count++
dfs(row, col)
}
}
}
return count
}