Algorithms first

LeetCode 经典 150 · 可视化

逐步动画、变量流转与五语言代码参考

搜索题库
#88 · 数组 / 字符串

合并两个有序数组

Merge Sorted Array

测试用例nums1 = [1,2,3,0,0,0], nums2 = [2,5,6]
线性序列9 个关键状态
步骤 1读指针指向两个数组末尾,写指针位于最右空位。i=2, j=2, write=5
1
0
2
1
i
3
2
0
3
0
4
write
0
5
推荐

从后向前双指针

时间 O(m+n)空间 O(1)

从最大值开始写入 nums1 的尾部,不会覆盖仍待比较的数据。

1function merge(nums1, m, nums2, n) {2  let i = m - 1,3    j = n - 1,4    write = m + n - 1;5  while (j >= 0) {6    if (i >= 0 && nums1[i] > nums2[j]) {7      nums1[write--] = nums1[i--];8    } else {9      nums1[write--] = nums2[j--];10    }11  }12}
多语言参考

Java · C++ · Go

来源 · CC BY-SA 4.0 ↗

这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。

1class Solution {2    public void merge(int[] nums1, int m, int[] nums2, int n) {3        for (int i = m - 1, j = n - 1, k = m + n - 1; j >= 0; --k) {4            nums1[k] = i >= 0 && nums1[i] > nums2[j] ? nums1[i--] : nums2[j--];5        }6    }7}
交互式算法学习

从执行步骤真正理解 LeetCode 经典 150

本站整理 150 道高频算法面试题和 302 种解法。动画方法同步展示 JavaScript 与 Python;每题另提供 Java、C++ 与 Go 同题参考实现。

多形态可视化数组、矩阵、DP 表、递归树、树图、链表、栈队列堆、区间和状态机按解法选择。
动画与代码同步当前状态、步骤说明、变量和代码高亮保持一一对应,可逐步播放和回退。
适合面试复习每种方案都给出思路、时间复杂度、空间复杂度、测试用例和 LeetCode 中文原题入口。
题目分类

LeetCode 经典 150 · 可视化

本站整理 150 道高频算法面试题和 302 种解法。动画方法同步展示 JavaScript 与 Python;每题另提供 Java、C++ 与 Go 同题参考实现。

数组 / 字符串

#88合并两个有序数组#27移除元素#26删除有序数组中的重复项#80删除有序数组中的重复项 II#169多数元素#189轮转数组#121买卖股票的最佳时机#122买卖股票的最佳时机 II#55跳跃游戏#45跳跃游戏 II#274H 指数#380O(1) 时间插入、删除和获取随机元素#238除了自身以外数组的乘积#134加油站#135分发糖果#42接雨水#13罗马数字转整数#12整数转罗马数字#58最后一个单词的长度#14最长公共前缀#151反转字符串中的单词#6Z 字形变换#28找出字符串中第一个匹配项的下标#68文本左右对齐

双指针

#125验证回文串#392判断子序列#167两数之和 II - 输入有序数组#11盛最多水的容器#15三数之和

滑动窗口

#209长度最小的子数组#3无重复字符的最长子串#30串联所有单词的子串#76最小覆盖子串

矩阵

#36有效的数独#54螺旋矩阵#48旋转图像#73矩阵置零#289生命游戏

哈希表

#383赎金信#205同构字符串#290单词规律#242有效的字母异位词#49字母异位词分组#1两数之和#202快乐数#219存在重复元素 II#128最长连续序列

区间

#228汇总区间#56合并区间#57插入区间#452用最少数量的箭引爆气球

#20有效的括号#71简化路径#155最小栈#150逆波兰表达式求值#224基本计算器

链表

#141环形链表#2两数相加#21合并两个有序链表#138随机链表的复制#92反转链表 II#25K 个一组翻转链表#19删除链表的倒数第 N 个结点#82删除排序链表中的重复元素 II#61旋转链表#86分隔链表#146LRU 缓存

二叉树

#104二叉树的最大深度#100相同的树#226翻转二叉树#101对称二叉树#105从前序与中序遍历序列构造二叉树#106从中序与后序遍历序列构造二叉树#117填充每个节点的下一个右侧节点指针 II#114二叉树展开为链表#112路径总和#129求根节点到叶节点数字之和#124二叉树中的最大路径和#173二叉搜索树迭代器#222完全二叉树的节点个数#236二叉树的最近公共祖先

二叉树层次遍历

#199二叉树的右视图#637二叉树的层平均值#102二叉树的层序遍历#103二叉树的锯齿形层序遍历

二叉搜索树

#530二叉搜索树的最小绝对差#230二叉搜索树中第 K 小的元素#98验证二叉搜索树

#200岛屿数量#130被围绕的区域#133克隆图#399除法求值#207课程表#210课程表 II

图的广度优先搜索

#909蛇梯棋#433最小基因变化#127单词接龙

字典树

#208实现 Trie (前缀树)#211添加与搜索单词 - 数据结构设计#212单词搜索 II

回溯

#17电话号码的字母组合#77组合#46全排列#39组合总和#52N 皇后 II#22括号生成#79单词搜索

分治

#108将有序数组转换为二叉搜索树#148排序链表#427建立四叉树#23合并 K 个升序链表

Kadane 算法

#53最大子数组和#918环形子数组的最大和

二分查找

#35搜索插入位置#74搜索二维矩阵#162寻找峰值#33搜索旋转排序数组#34在排序数组中查找元素的第一个和最后一个位置#153寻找旋转排序数组中的最小值#4寻找两个正序数组的中位数

#215数组中的第K个最大元素#502IPO#373查找和最小的 K 对数字#295数据流的中位数

位运算

#67二进制求和#190颠倒二进制位#191位1的个数#136只出现一次的数字#137只出现一次的数字 II#201数字范围按位与

数学

#9回文数#66加一#172阶乘后的零#69x 的平方根 #50Pow(x, n)#149直线上最多的点数

一维动态规划

#70爬楼梯#198打家劫舍#139单词拆分#322零钱兑换#300最长递增子序列

多维动态规划

#120三角形最小路径和#64最小路径和#63不同路径 II#5最长回文子串#97交错字符串#72编辑距离#123买卖股票的最佳时机 III#188买卖股票的最佳时机 IV#221最大正方形