- 缺失的第一个正数
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
示例 1:
输入:nums = [1,2,0] 输出:3 示例 2:
输入:nums = [3,4,-1,1] 输出:2 示例 3:
输入:nums = [7,8,9,11,12] 输出:1
提示:
1 <= nums.length <= 5 * 105 -231 <= nums[i] <= 231 - 1 通过次数221,132提交次数519,587
关键点
- 原地哈希。小于 1 的元素转为大于数组个数的值,如:size+1。然后以元素值为下标,小于等于 n ,数组中对应值设置为 负数。从左往右遍历数组,第一个不为负数,则表示其下标元素不存在。
class Solution {
public int firstMissingPositive(int[] nums) {
for(int i=0; i<nums.length; i++){
if(nums[i] <= 0){
nums[i] = nums.length + 1;
}
}
for(int i=0; i<nums.length; i++){
int index = Math.abs(nums[i]);
if(index <= nums.length ){
nums[index-1] = -Math.abs(nums[index-1]);
}
}
for(int i=0; i<nums.length; i++){
if(nums[i] > 0 ){
return i+1;
}
}
return nums.length+1;
}
}
|