“脏工作环境 ”的应用。利用到了思想:只要是对结果没有影响的数据在本题就可以替换成1(前提是1存在于数组中)
代码来自:https://leetcode-cn.com/problems/first-missing-positive/solution/que-shi-de-di-yi-ge-zheng-shu-by-leetcode/
//LEETCODE
//找第一个缺失的正整数
public int firstMissingPositive(int[] nums){
int n = nums.length;
int contains = 0;
for(int i = 0;i < n;i++){
if(nums[i] == 1){
contains++;
break;
}
}
//没有1
if(contains == 0){
return 1;
}
if(n == 1){
return 0;
}
//找出所有的小于1的数和大于n的数,都置为1。
//因为要找第一个正整数,所以0和负数对于数组就没有影响,此时数组中也必定有1,所以直接置1就可以。
for(int i = 0;i < n;i++){
if(nums[i] < 1 || nums[i] > n){
nums[i] = 1;
}
}
for(int i = 0;i < n;i++){
int a = Math.abs(nums[i]);//相当于新nums[]的下标。
if(i == n){
nums[0] = - Math.abs(nums[0]);
}else{
//存在a就置负号,a就是新数组的下标。
//下标为负数就是存在当前下标的值,下标为正数就是不存在当前下标的值。
nums[a] = - Math.abs(nums[a]);
}
}
for(int i = 1;i < n;i++){
if(nums[i] > 0){
return i;
}
}
//如果从1开始全是负数,最后nums[0] > 0,那么n就是不存在。
if(nums[0] > 0){
return n;
}
//如果全是负数,就是全都是存在的,就是1,2,3,4,5,6,7,8这种,找最小的正整数就是n + 1;
return n + 1;
}
自己写的是:找到第一个最小的正整数,然后把所有数组里的值放在list值里,开始逐一判断++min在不在list里,如果不在就找到了最小的缺失的正整数。
public int firstMissingPositive(int[] nums) {
/**
*@Description 找出第一个丢失的正整数
*@Param [nums]
*@Return int
*@Author pdzz
*@Date 2019/12/17
*@Time 9:31
*/
/*
输入: [3,4,-1,1]
输出: 2
*/
int min = Integer.MAX_VALUE;
for (int i = 0; i < nums.length; i++) {
if (nums[i] > 0 && nums[i] < min){
min = nums[i];
}
}
if (min > 1){
return 1;
}
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
list.add(nums[i]);
}
while (true){
if (!list.contains(++min)){
break;
}
}
return min;
}