classSolution{publicintfirstMissingPositive(int[] nums){int len = nums.length;// 先提前确定是否有1 int count =0;for(int i =0; i < len ; i++){// 先排除里面原本的1 if(nums[i]==1){
count++;break;}}if(count ==0)return1;if(nums.length ==1)return2;// 将负数、0还有大于n的数设置为1 for(int i =0; i < len ; i++){if(nums[i]<=0|| nums[i]> len){
nums[i]=1;}}for(int i =0; i < len ; i++){int a = Math.abs(nums[i]);// 当等于n时,没办法存储,所以放入0 if(a == len){
nums[0]=-Math.abs(nums[0]);}else{
nums[a]=-Math.abs(nums[a]);}}// 先判断前面是否连续 for(int i =1; i < len ; i++){if(nums[i]>0)return i;}if(nums[0]>0){return len;}return len+1;}}
```
==时间复杂度为O(n),空间复杂度为O(1)==
## 3.思考
@1、寻找缺失的第一个正数,如果有n个数,如果都连续从1,2,3,4,5开始,那么最大为n+1,其余<n+1@2:将负数,<0的数标为正数1,第一是标为正数,后面以>0好判断,如果标为负数,数组中既有正又有负,
如果nums[a], a为Math.abs(nums[i]),它存在我就标为负数,那么负数就会被标为正,标为正,就证明不存在,
如果全部转换为负数,将问题弄复杂了。之所以将负数和0还有大于n的数标为1,就是不想影响其他正数的判断,提前判断1存不存在好判断,但是其他数字不好判断。
@3:以索引做下标,下标存在,该值存在。应该先判断i=1的值是否连续,再判断n