首页 > 其他 > 详细

41. 缺失的第一个正数

时间:2020-12-15 14:59:39      阅读:22      评论:0      收藏:0      [点我收藏+]

题目:给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。

示例 1:

输入: [1,2,0]
输出: 3

示例 2:

输入: [3,4,-1,1]
输出: 2

示例 3:

输入: [7,8,9,11,12]
输出: 1

 

思路:

//把小于nums.length的值放到与下标对应,结束后 ,有以下几种情况:

//1.从下标1开始位移,遇到第一个不同的下标与值不同的元素,即为要求元素;

//2.走到底,说明正数1-nums.lemgth-1都存在,此时判断nums[0]是否为nums.lemgth,是则答案为nums.lemgth+1,不是则为nums.lemgth

 

代码: 

class Solution {
    public int firstMissingPositive(int[] nums) {
       //特殊情况特殊处理
        if(nums.length==0||nums==null){return 1;}       
        if(nums.length==1){
            if(nums[0]<=0){return 1;}
            if(nums[0]==1){return 2;}
            else{return 1;}
        }
 
        for(int i=0;i<nums.length;){
            if(nums[i]<nums.length&&nums[i]>=0){ 
                if( nums[i]!=i&&nums[i]!=nums[nums[i]] ){swap(nums,i,nums[i]);  continue; }//把下标和值相匹配  同时考虑元素存在重复情况,当下标与值不匹配,但值所在的下标与这个下标内的值匹配不用交换位置  
            }
            i++;
        } 
          
        for(int i=1;i<nums.length;i++){
           if(nums[i]!=i){ return i;} //循环一次,下标与值不同的第一个元素就是缺失的数字
        }
        if(nums[0]==nums.length){return nums.length+1;}  //循环退出,考虑下标0内元素
        return nums.length;
    } 


    public static void swap(int[] nums,int i,int j){
        int temp=nums[i];
        nums[i]=nums[j];
        nums[j]=temp;
    }
}

41. 缺失的第一个正数

原文:https://www.cnblogs.com/SEU-ZCY/p/14137983.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!