leetcode_41:First Missing Positive

这个题目是求缺失的最小正整数,所以一定是要看给定的所有数,然后从1开始数,直到找到一个不存在的正整数为止。这里我们就想到了使用数组来作为一个简单的哈希表,下标作为Key,数组的值作为Value。接下来可以分析一下求解这个题目要注意的地方:

  • 要知道如果给定10个数,那么缺失的最小值最大只能为11,也就是数组的长度+1,因为若为11需要前面10个正数为1~10才可以,只要有一个数X不在这个范围,那缺失的值就是这个X。
  • 数组中还有可能存在极大的值(大正数)和极小的值(小负数),所以要想办法处理这些比较“特殊”的值。
  • 综上,可以用一个新的数组来存原来的数组中各元素出现的次数,数组内存放的是给定数组中所有元素出现的次数。加入3出现在给定数组中,则新数组中下标为3元素+1。所以这个数组前后均会多出一个元素:开头存放非正数的个数,末尾存放大于给定数组长度的个数

能够得出代码如下:

    public int firstMissingPositive(int[] nums) {

        int[] temp = new int[nums.length + 2];
        for (int num : nums) {
            if (num <= 0)		
                temp[0]++;			//开头存非正数的个数
            else if (num > nums.length)
                temp[temp.length-1]++;			//末尾存大于给定数组长度的数的个数
            else {
                temp[num]++;			//新数组中各元素对应下标的元素加1,表示这个元素的个数
            }
        }
        int i;
        for (i = 1; i < temp.length; i++) {			//找到第一个不为0的数,则就是它对应的下标
            if (temp[i] == 0)
                return i;
        }

        return i;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值