📌  相关文章
📜  给定数组中不存在的最大为 N 的正整数(1)

📅  最后修改于: 2023-12-03 15:27:35.178000             🧑  作者: Mango

给定数组中不存在的最大为 N 的正整数

在开发过程中,经常会遇到需要在一个给定的数组中寻找不存在的最大正整数并返回的问题。这里介绍两种解决方案,让您在遇到该问题时能够应对自如。

方案一:桶排序法
思路

先对数组进行桶排序,然后遍历桶,找到最小的没被占用的桶,该桶的下标即为所求的结果。如果找不到这样的桶,则说明数组中不存在正整数。

代码
public int findMissingNumberByBucketSort(int[] nums, int n) {
    int[] bucket = new int[n + 1];
    for (int num : nums) {
        if (num >= 1 && num <= n) {
            bucket[num]++;
        }
    }
    for (int i = 1; i <= n; i++) {
        if (bucket[i] == 0) {
            return i;
        }
    }
    return n + 1;
}
时间复杂度

桶排序的时间复杂度为O(n),遍历桶的时间复杂度为O(n),总时间复杂度为O(n)。

方案二:原地哈希法
思路

遍历数组,将每个元素移动到对应的位置,如果该位置上已经存在元素,则继续寻找下一个位置,直到找到一个空位置或者越界。再次遍历数组,查找第一个未被占用的位置,如果找到则该位置的下标即为所求的结果,否则结果为n+1,因为前n个正整数肯定会在数组中出现。

代码
public int findMissingNumberByInPlaceHash(int[] nums, int n) {
    for (int i = 0; i < nums.length; i++) {
        while (nums[i] > 0 && nums[i] <= nums.length && nums[nums[i] - 1] != nums[i]) {
            int temp = nums[nums[i] - 1];
            nums[nums[i] - 1] = nums[i];
            nums[i] = temp;
        }
    }
    for (int i = 0; i < nums.length; i++) {
        if (nums[i] != i + 1) {
            return i + 1;
        }
    }
    return n + 1;
}
时间复杂度

遍历数组的时间复杂度为O(n),总时间复杂度为O(n)。

总结

以上两种解决方案都是比较高效的算法,可以在O(n)的时间复杂度内解决该问题。在选择具体的方案时,需要根据实际情况进行考虑,比如数组范围、元素个数等。