题目
给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0]
输出: 3
示例 2:
输入: [3,4,-1,1]
输出: 2
示例 3:
输入: [7,8,9,11,12]
输出: 1
思路
把数组存放在set里面,然后,从1开始遍历到length,一个长度为length的最小正整数只可能落在这个范围内!
代码
import java.util.HashSet;
import java.util.Set;
class Solution {
public int firstMissingPositive(int[] nums) {
int length=nums.length;
Set <Integer>set =new HashSet<>();
for (int i=0;i<length;++i)
set.add(nums[i]);
int j=1;
//长度为length的数组,最小整数一定在1-length之间
for ( ;j<=length;++j)
if (!set.contains(j))
break;
return j;
}
}
结果
没什么技术含量,就只会利用一个容器,然后暴力一下,直接解开而已!
大佬思路
长度为length的数组,缺失的第一个正整数的范围一定在 1-length之间。
我们把每个元素,放到它对应的位置上去,比如1,我们就放到下标0的位置上去,把2放到下标为2的地方,负数和大于length长度的数不管他。
代码
class Solution {
public int firstMissingPositive(int[] nums) {
int length=nums.length;
for (int i=0;i<length;)
{
int val=nums[i];
/*把数放到对应的位置上去, 数要是正数,而且数值必须小于等于length,这样数组才能放得下
nums[i]的值 val 不等于 i+1,比如 下标为0的位置数值不为1 ,且等待交换的值不是对应的值
比如要交换的小标为3它的数值已经是4了,我们就没必要交换了*/
if (val>0 && val<=length && val!=i+1 && nums[val-1]!=val)
swap(nums,i,val-1);
else
++i;
}
for (int i=0;i<length;++i)
{
if (nums[i]!=i+1)
return i+1;
}
return nums.length+1;
}
//交换数组位置
public static void swap(int[]nums,int i,int j)
{
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}
结果
大佬的思路还是挺妙的,看了好久才看得懂。这个才是有技术含量的!