题解 | #缺失的第一个正整数#

缺失的第一个正整数

http://www.nowcoder.com/practice/50ec6a5b0e4e45348544348278cdcee5

看了leetcode的空间O(1)解法自己写了遍代码,记录一下思路吧 主要是把原来数组当做hash表用的思想,由于如果数组中有空隙,解肯定在[1,n]之间,那么在数组相应的[0,n-1]位置标记这些存在的元素,比如遍历到一个4,那么就把下标为4-1=3的位置的值置为负数,置为负数这个点很巧妙,这个负数不能随意设置一个负数,必须是原来正数的相反数,因为如若不然,会篡改后面的信息。那么这就又引出了问题,数组中原来的负数怎么处理呢,答案是在上述步骤前先置为n+1,超过数组界限,这样不会修改数组中的位置信息,统一初始状态,避免置为相反数时冲突的问题。 给出java实现 public int minNumberDisappeared (int[] nums) { // Map<Integer,Integer> pos=new HashMap<>();

    // write code here
    int len=nums.length;
    for(int i=0;i<len;i++){
        if(nums[i]<=0) nums[i]=len+1;
    }
    for(int i=1;i<len+1;i++){
        int x;
        if(nums[i-1]<0) x=-nums[i-1];
        else x=nums[i-1];
        
        if(x>0 && x<len+1) nums[x-1]=-nums[x-1];
        
    }
    for(int i=0;i<len;i++){
        if(nums[i]>0) return i+1;
    }
    return len+1;
    
}
全部评论

相关推荐

11-01 08:48
门头沟学院 C++
伤心的候选人在吵架:佬你不要的,能不能拿户口本证明过户给我。。球球了
点赞 评论 收藏
分享
评论
点赞
1
分享
牛客网
牛客企业服务