首页 > 其他 > 详细

41. 缺失的第一个正数

时间:2020-06-05 11:09:37      阅读:27      评论:0      收藏:0      [点我收藏+]

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

技术分享图片

提示:

你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。

class Solution {
    private void swap(int[] nums,int i, int k){
        int temp = nums[i];
        nums[i] = nums[k];
        nums[k] = temp;
    }
    public int firstMissingPositive(int[] nums) {
        //方法1,先排序,再用二分法,时间复杂度O(nlogn)空间复杂度O(1)
        //方法2,把无序数组存入哈希表,然后在遍历哈希表。时间复杂度O(n),空间复杂度O(n)
        //方法3,原地哈希法,把i个元素放在第nums[i]-1个位置上,再遍历一遍找到缺失的数字
        int len = nums.length;
        for(int i=0;i<len;i++){//nums[nums[i]-1]查看第i个元素的值是否放正确
            while(nums[i]<len&&nums[i]>0&&nums[i]!=nums[nums[i]-1]){
                //当前数>0才需要排序,<len才可以放进当前的数组中,此处用while复杂度不会高,因为均摊复杂度
                //swap交换i个元素放在第nums[i]-1个位置上,此时需要再次比对
                //当前i个位置交换后的数是否正确,如果不对需要重复
                swap(nums,i,nums[i]-1);
            }
        }
        for(int j=0;j<len;j++){
            if(j+1!=nums[j]){
                return j+1;
            }
        }
        //全都遍历没有问题那么缺失的数字为当前数组最大的数len+1;
        return len+1;
    }
}

 

41. 缺失的第一个正数

原文:https://www.cnblogs.com/ScarecrowAnBird/p/13047828.html

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