题解 | #缺失的第一个正整数,时间O(n),空间O(1)#

缺失的第一个正整数

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

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型
     */     
    public int minNumberDisappeared (int[] nums) {
        if (nums == null || nums.length == 1) return 1 ;
        //缺失的最小数一定在[1-len]
        int len = nums.length ;
        //对于nums[i],若其在[1-len]之间,则将其放入正确位置,即i-1处;若不在[1-len]则不管,i++
        for(int i = 0 ; i < len ; i ++) {
            //若nums[i]在[1-len]之间,则将其放入正确位置(交换),交换后,
            //新的nums[i]再继续此操作,直到nums[i]不在[1-len]或者
            //nums[i]和其即将交换的位置的元素nums[nums[i]-1]相等
            while(nums[i] >= 1 && nums[i] <= len && nums[i] != i+1 && nums[i] != nums[nums[i]-1]) {
                swap(nums, i , nums[i]-1) ;
            }
        }
        //遍历,如果位置i的元素不是i+1,说明此位置缺失i+1
        for(int i = 0 ; i < len ; i ++) {
            if(nums[i] != i+1) return i + 1 ;
        }
        //如果都在正确的位置,(即[1-len]都出现了),那么直接返回len+1
        return len + 1 ;
    }
    public void swap(int[] arr , int i , int j) {
        int t = arr[i] ;
        arr[i] = arr[j] ;
        arr[j] = t ;
    }
}

一个菜鸟的算法刷题记录 文章被收录于专栏

分享一个菜鸟的成长记录

全部评论

相关推荐

点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-21 17:16
科大讯飞 算法工程师 28.0k*14.0, 百分之三十是绩效,惯例只发0.9
点赞 评论 收藏
分享
1 1 评论
分享
牛客网
牛客企业服务