未出现的最小正整数

Posted vividbingo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了未出现的最小正整数相关的知识,希望对你有一定的参考价值。

引入

  给定一个无序整型数组 arr ,找到数组中未出现的最小正整数。

分析

  令无序整形数组 arr 的大小为 n,可以推出未出现的最小正整数技术图片

  最优情况为是数组 arr 包含 1 ~ n 所有整数并且 arr[i-1] = i。

  ① 如果 arr[l] == 1 + l,所以 arr 已经包含的正整数范围为[1,l+1],还未确定的最优范围为 (l+1,r]。

  ②

    1. 如果 arr[l] <= l,因为 arr 已经包含的正整数范围为[1,l],所以当arr[l] <= l 时说明重复或者为负数,“浪费”了一个位置,

                 此时将 arr[r-1] = arr[l],同时将还未确定的最优范围改成(l,r-1]。

    2. 如果 arr[l] > r,因为超出了最优范围(l,r],所以“浪费”了一个位置,此时将 arr[r-1] = arr[l],

                 同时将还未确定的最优范围改成(l,r-1]。

    3. 如果 arr[arr[l] - 1] == arr[l],说明 arr[l] 技术图片,而且应该把这个数放在 arr[l] - 1的位置上,但此时arr[arr[l] - 1] == arr[l],

                 说明 arr[l] 重复,”浪费“了一个位置,所以同 1,2步一样,将 arr[r-1] = arr[l],同时将还未确定的最优范围改成(l,r-1]。

  ③ 此时说明 arr[l] 技术图片,并且此时并未发现重复,应该将 arr[l] 放到 arr[l] - 1 的位置上,所以交换。

实现

int findMissMin(int arr[],int n) 
{
        int l = 0;
        int r = n;
        while (l < r) 
        {
            if (arr[l] == l + 1) 
                l++;
            else if (arr[l] <= l || arr[l] > r || arr[arr[l] - 1] == arr[l]) 
                arr[l] = arr[--r];
             else 
                swap(arr, l, arr[l] - 1);
        }
        return l + 1;
}

以上是关于未出现的最小正整数的主要内容,如果未能解决你的问题,请参考以下文章

未出现的最小正整数

查找数组中未出现的最小正整数

[算法]数组中未出现的最小正整数

返回 Array 中未出现的最小正整数(大于 0)

N个数中未出现的最小整数

线性表练习之Example030-找出数组中未出现的最小正整数