题目
题目补充说明:这题中输入的数据中可以有负值,可以有重复的值,其中真正需要的排序效果是1,2,3,4…n这样的效果,让在这些数据之间找到缺失的第一个正数。
解析
分析:在明确了题目的实际要求之后,就可以设计算法了,比如如何处理负数和重复的数据,如何满足题目对于时间复杂度和空间复杂度的要求,时间复杂度要求只能遍历一遍,空间复杂的决定了算法中只能使用常数变量而不能使用HashMap。于是我的思路是先快排,让数组基本有序,然后用常数k来保存下一个应该出现的数字,找到就继续找下一个,找不到就返回这个数。
算法实现:
算法中滤掉了非正数和重复数,实现线性查找数据。如果比对中各个数都存在,那么最后依然是返回累加后的k值。
class Solution {
public int firstMissingPositive(int[] nums) {
int k=1;
Arrays.sort(nums);
for(int i=0;i<nums.length;i++){
if(nums[i]<=0){
continue;
}
if(i>0&&nums[i]==nums[i-1]){
continue;
}
if(nums[i]!=k){
return k;
}
k++;
}
return k;
}
}