algorithm - 对元素范围为 1 到 n 的给定数组进行排序,其中一个元素缺失,一个元素重复

标签 algorithm sorting

我必须在 O(n) 时间和 O(1) 空间内对这个数组进行排序。

我知道如何在 O(n) 中对数组进行排序,但这不适用于丢失和重复的数字。如果我先找到重复和缺失的数字(可以在 O(n) 中完成)然后排序,这似乎很昂贵。

static void sort(int[] arr)
{
    for(int i=0;i<arr.length;i++)
    {
        if(i>=arr.length)
            break;
        if(arr[i]-1 == i)
            continue;
        else
        {
        while(arr[i]-1 != i)
        {
            int temp = arr[arr[i]-1];
            arr[arr[i]-1] = arr[i];
            arr[i] = temp;
        }
        }
    }
}

最佳答案

首先,您需要找到缺失和重复的数字。您可以通过求解以下方程组来做到这一点:

equation

通过遍历数组同时计算左和。右和甚至更简单——您可以使用算术级数的公式来避免循环。所以,现在您有了两个方程组,其中有两个未知数:缺失数 m 和重复数 r。解决它。

接下来,您通过从左到右用数字 1 到 n 填充数组来“排序”数组,省略 m 并复制 r。因此,整个算法只需要两次遍历数组。

关于algorithm - 对元素范围为 1 到 n 的给定数组进行排序,其中一个元素缺失,一个元素重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38343069/

相关文章:

algorithm - 一种根据比例重新计算坐标线上标记的算法

java - 拆分段落中的每个字符串

java - 生成给定字符串的所有排列

algorithm - 自然语言查询理解

algorithm - 从 01 包扩展的 N 包问题(来自同行评分)

algorithm - 如何计算 kruskal 算法的时间复杂度可能是 O(E log E) = O(E log V)。?

mysql - 复杂的sql分组排序

c - 按多个参数对链表进行排序

algorithm - 冒泡排序算法 while 循环功能

java - 一个接一个地打乱不超过两个相同类别元素的表