【问题标题】:Removing duplicates from a sorted array IN-PLACE without allocating space for a second array在不为第二个数组分配空间的情况下从已排序的数组中删除重复项
【发布时间】:2021-01-25 17:09:21
【问题描述】:

我的任务是解决一个令人费解的问题。我正在尝试将带有重复项的未排序数组转换为没有重复项的已排序数组。我使用选择排序来完成第一部分:

public static void SelectionSort(int [] list) {
        int i = 0;
        int j = 0;

        int indexSmallest = 0;
        int temp = 0;

        for (i = 0; i < list.length - 1; i++) {
            indexSmallest = i;
            for (j = i + 1; j < list.length; j++) {
                if (list[j] < list[indexSmallest]) {
                    indexSmallest = j;
                }
            }

            temp = list[i];
            list[i] = list[indexSmallest];
            list[indexSmallest] = temp;
        }

    }

排序不是问题——我很难从数组中删除重复项。我脑海中的解决方案是创建一个辅助数组,并遍历输入以检查该元素是否存在于第二个数组中,如果不存在,则将其添加到数组中。我被卡住了,因为我无法创建另一个数组。那么,什么给了?如果我不能创建一个数组来交叉引用并检查我是否有唯一值,我该如何解决这个问题?我无法使用任何内置的 Java 函数。

【问题讨论】:

    标签: java sorting duplicates


    【解决方案1】:

    不需要第二个数组...这样想...

    最简单的方法是将其转换为set/hashset,然后在数组中排序。

    但是如果集合被禁止,唯一的可能就是把重复的放在最后,把它们剪掉,然后对其余的进行排序。

    [1,8,1,2,3,5,3] 在这个数组中,你需要删除重复的元素......好吧......那么如果我们做这样的事情......我们将这个数组“拆分”成“排序”,“未排序”和重复”和“重复”。现在我们要做的是使用 2 个指针遍历数组。一个在第一个元素(我们称之为"i")和最后一个元素(我们称之为"j")......现在我们将去while i &lt; j,我们每次都会交换,当我们会发现重复时。这样,您将得到在"i" 之前不重复的所有内容以及在"i" 之后重复的所有内容...现在您将从索引0 对数组进行排序,然后对索引i 进行排序,您应该已经排序了数组,您将只需删除重复项...

    ofc.,这将需要时间复杂度,以便能够处理 O(n*logn) / O(n^2) ...

    有一种方法可以在 O(n) 中完成,并且可以通过它来完成......你将使用 2 个指针......

    一个将指向当前已排序的数组,其中没有重复项,而 toher 将指向一个地方,其中还有未交换的整数...(您需要记住找到的最大数字)

    更具体一点:

    [1,2,2,3,3,4,5]
    i = 0, j = 1
    - fine
    i = 1, j = 2
    - duplicate ... soo ..
    jumping to duplicate position
    i = 2, j = 3 (array[3] != 2, so we will swap)
    current array -> [1,2,3,2,3,4,5]
                          ^ ^  
                          i j
    i = 3, j = 4 
    - highest_number > 3 is not true (2 < 3), so skipping
    i = 3, j = 5
    - highest_number > 3 is not true (3 < 3), so skipping
    i = 3, j = 6
    - swapping
    ... etc
    
    and you should end up with something like this
    [1,2,3,4,5,2,3]
               ^ ^
               i j
    now you can cut the array at i, so you will get `[1,2,3,4,5,\0]` (in C syntax) ... so basically `[1,2,3,4,5]`
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-01
      • 1970-01-01
      • 2011-05-22
      • 2016-01-24
      • 2019-04-04
      相关资源
      最近更新 更多