缺失数字:标记数组解法
296 字
1 分钟
缺失数字:标记数组解法
核心结论
输入包含 [0, n] 中的 n 个不同数字。建立长度为 n + 1 的标记数组,记录每个数字是否出现,再返回唯一未标记的位置即可。
问题
例如 [3, 0, 1] 缺少 2,[9, 6, 4, 2, 3, 5, 7, 0, 1] 缺少 8。
核心机制
数组索引正好覆盖完整候选范围 [0, n]。遍历输入时把 seen[value] 设为 true;第二次遍历索引时,第一个 false 就是答案。
Java 实现
class Solution {
public int missingNumber(int[] nums) {
boolean[] seen = new boolean[nums.length + 1];
for (int value : nums) {
seen[value] = true;
}
for (int value = 0; value < seen.length; value++) {
if (!seen[value]) {
return value;
}
}
throw new IllegalStateException("input does not satisfy the constraints");
}
}
设计取舍
标记数组直观且不修改输入,时间复杂度为 O(n),空间复杂度为 O(n)。如果必须使用 O(1) 额外空间,可以对 [0, n] 与输入元素执行异或,或计算等差数列总和后减去输入总和;求和方案需要注意整数溢出。
验证
覆盖缺少 0、缺少 n、仅含一个元素以及一般顺序被打乱的输入。
参考
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章智能推荐
1
最小路径和:二维动态规划基础解法
algorithms使用二维动态规划记录到达每个网格的最小代价,讲清边界初始化、状态转移与复杂度。
2
最小路径和:压缩二维动态规划
algorithms从只能向右或向下移动的约束推导最小路径和状态转移,并将二维状态表压缩为一维数组。
3
最大正方形:用相邻状态确定边长
algorithms定义以当前单元格为右下角的最大正方形边长,推导三邻居状态转移,并给出 Java 动态规划实现。
4
太平洋大西洋水流:从海岸反向搜索
algorithms从两片海洋的边界逆着水流方向搜索,求两个可达集合的交集,避免从每个陆地单元重复遍历。
5
二叉树中序遍历:递归与显式栈
algorithms从左、根、右的访问顺序出发,实现二叉树中序遍历,并比较递归与显式栈两种写法的边界和复杂度。
随机文章随机推荐


