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

三数之和

http://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711

方法一:时间复杂度o(n),空间复杂度o(n)

import java.util.*;


public class Solution {
    /*
    * 如果数组中所有数都为1-n范围内,且1-n全部都在,为n+1
    * 如果有一个不在1-n范围内,则结果<=n
    * 依据这样的思路可以想到:遍历数组,如果不在1-n范围内,肯定不是要求的数字,删除
    * 如果在1-n范围内,将对应的hash表值设置为true,从前往后枚举hash表找到第一个false的值
    *
    * */
    public int minNumberDisappeared(int[] nums) {
        HashMap<Integer, Boolean> hashMap = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] >= 1 && nums[i] <= nums.length) {
                hashMap.put(nums[i], true);
            }
        }
        for (int i = 1; i <= nums.length; i++) {
            if (!hashMap.containsKey(i))
                return i;
        }
        return nums.length + 1;
    }
}

方法二:原地hash,空间复杂度o(1),时间复杂度o(n)

public int minNumberDisappeared(int[] nums) {
        int n = nums.length;
        //将所有的负数置为n+1,下面负数不参与讨论
        for (int i = 0; i < n; i++) {
            if (nums[i] <= 0) {
                nums[i] = n + 1;
            }
        }
        for (int i = 0; i < n; i++) {
            //将在n范围内的值对应下标的值置为负值,说明,该下标的值出现过
            if (Math.abs(nums[i]) <= n) {
                nums[Math.abs(nums[i]) - 1] = -1 * Math.abs(nums[Math.abs(nums[i]) - 1]);
            }
        }
        //第一个正数说明是未出现的值
        for (int i = 0; i < n; i++) {
            if (nums[i] > 0) {
                return i + 1;
            }
        }
        return n + 1;
    }

全部评论

相关推荐

10-16 19:16
Java
点赞 评论 收藏
分享
迷茫的大四🐶:都收获五个了,兄弟那还说啥,不用改了,去玩吧
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务