/**
* 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
* <p>
* 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
*
*/
public int firstMissingPositive1(int[] nums) {
int len = nums.length;
//数据校验
if (nums == null || len == 0) {
return 1;
}
//hash结构判断是否存在于集合中
HashSet<Integer> set = new HashSet<>();
//将数组元素添加到集合中
for (int i = 0; i < len; i++) {
set.add(nums[i]);
}
//判断是否存在
for (int i = 1; i <= len; i++) {
if (!set.contains(i)) {
return i;
}
}
return len + 1;
}
public int firstMissingPositive(int[] nums) {
int len = nums.length;
//数据校验
if (nums == null || len == 0) {
return 1;
}
//将数组中所有小于等于0的数全部变为 len + 1 ,即将他们全部置为正数
for (int i = 0; i < len; i++) {
if (nums[i] <= 0) {
nums[i] = len + 1;
}
}
//遍历数组中的元素,将小于等于len的元素,将它对应的索引位置的元素全部置为负数,即添加标记
for (int i = 0; i < len; ++i) {
//记录这个元素所在的索引
int num = Math.abs(nums[i]);
if (num <= len) {
//将索引处的元素置为负数
nums[num - 1] = -Math.abs(nums[num - 1]);
}
}
//遍历集合寻找没有添加标记的元素,若都添加标记,则最小正整数为 len + 1
for (int i = 0; i < len; i++) {
if (nums[i] > 0) {
return i + 1;
}
}
return len + 1;
}
原文:https://www.cnblogs.com/mx-info/p/14807936.html