
leetCode 41.First Missing Positive (第一个丢失的正数) 解题思路和方法
初始化检查:如果数组为空,直接返回1。 排列数组:遍历每个元素,如果当前元素不在正确的位置,进入循环交换,确保它移动到正确的位置。这种交换避免了死循环,并保持了局部有序。 寻找缺失元素:第二遍遍历数组,检查每个位置是否正确,第一个不正确的位置i的值i+1即为答案。
发布日期:2025-04-04 23:35:45
浏览次数:12
分类:精选文章
本文共 1345 字,大约阅读时间需要 4 分钟。
重新优化后的文章内容:
在找出数组中第一个缺失的正整数问题上,虽然没有明显的直观解法,但通过巧妙的处理,确实可以在O(n)时间和常数空间内解决。以下是一种高效的方法:
步骤一:整理数组
我们首先遍历数组,并将每个正数调整到它所在的位置。具体来说,对于每个索引i,数组中当前的值应该是i+1。如果当前值不对,我们需要交换它到正确的位置。这样可以确保数组在第一遍处理后趋于有序。
步骤二:检查结果
在第一遍处理之后,数组中的每个索引i应该存储的值是i+1。第二遍遍历数组,寻找第一个位置i,其中数组[i]不等于i+1。这个位置i+1就是我们要找的答案。
这种方法充分利用了原数组的空间,确保了只需常数额外空间,达到O(n)的时间复杂度。
实际代码示例
public class Solution { public int firstMissingPositive(int[] nums) { if (nums.length == 0) { return 1; } for (int i = 0; i < nums.length; i++) { if (nums[i] > 0 && nums[i] != i + 1) { int j = nums[i] - 1; while (j >= 0 && j < nums.length) { if (nums[j] == i + 1) { break; } if (j == i) { break; // Prevents infinite loop } int temp = nums[j]; nums[j] = nums[i]; nums[i] = temp; } } } for (int i = 0; i < nums.length; i++) { if (nums[i] != i + 1) { return i + 1; } } return nums.length + 1; }}
解释
这种方法不仅高效,还直观地展示了如何利用数组自身来解决问题,达到了最佳的时间复杂度。
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年05月07日 02时21分27秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Kubernetes实战(二十八)-环境共享与隔离(Namespace)
2023-01-29
Kubernetes实战(十五)-敏感数据管理(Secret)
2023-01-29
Kubernetes实战(十八)-共享卷子路径划分(Subpath)
2023-01-29
Kubernetes实战(十)-升级和回滚(Deployment)
2023-01-29
Kubernetes对接Ceph存储实现云原生持久化
2023-01-29
Kubernetes对象Service详解
2023-01-29
kubernetes常用工具
2023-01-29
Kubernetes快速上手:部署、使用及核心概念解析
2023-01-29
Kubernetes故障排查与面试汇总
2023-01-29
Kubernetes故障排查实战
2023-01-29
kubernetes混合云平台运维实战项目分享
2023-01-29
kubernetes社区项目生态概览
2023-01-29
Kubernetes网络插件使用详解
2023-01-29
Kubernetes调度单位Pod
2023-01-29
Kubernetes部署Dashboard实战
2023-01-29
Kubernetes集群升级实战
2023-01-29