缺失的第一个正数
缺失的第一个正数
题目
给你一个未排序的整数数组
nums
,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为
O(n)
并且只使用常数级别额外空间的解决方案。
示例
示例 1:
输入:nums = [1,2,0]
输出:3
解释:范围 [1,2] 中的数字都在数组中。
示例 2:
输入:nums = [3,4,-1,1]
输出:2
解释:1 在数组中,但 2 没有。
示例 3:
输入:nums = [7,8,9,11,12]
输出:1
解释:最小的正数 1 没有出现。
思路
- 寻找缺失的第一个正数,并且使用常数级的额外空间,那么就要考虑利用它本身的数组空间
- 可以使用数组中的数放在相对应的位置,首先是寻找缺失的第一个正数,那么考虑的范围就是1-数组的长度减一,将这些数放在对应的位置上,然后再遍历一遍数组,对应位置不是对应数的就是缺失的一个数,比如说nums[2]存放的就应该是2,第一个不符合规律的就是要找的数字。
代码实现
public void test() {
firstMissingPositive(new int[]{1,2,0});
}
public static int firstMissingPositive(int[] nums) {
if(nums == null&&nums.length==0){
return 1;
}
for (int i = 0; i < nums.length; i++) {
//如果num[i] 大于0 且小于 num.lenght ,nums[i] != nums[nums[i] - 1] 防止死循环
while (nums[i] != i + 1 && nums[i] > 0 && nums[i] < nums.length && nums[i] != nums[nums[i] - 1] ){
int temp = nums[i];
nums[i] = nums[temp - 1];
nums[temp - 1] = temp;
}
}
for (int i = 0; i < nums.length; i++) {
if (nums[i] != i + 1) {
return i + 1;
}
}
return nums.length + 1;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)