2010-01-13 102 views
0

我需要從數組中刪除重複的條目,但不能使用任何新的數據結構,同一個數組只能返回不同的元素。例如,如果我的數組是1,3,3,3,5,55,67,1那麼結果應該是1,3,5,55,67從數組中刪除重複

我相信我已經解決了這個問題,但是我需要您的意見,看它是否是一個好的算法,或者如果我需要改變某些東西。

public void DeleteDuplicate(int[] array) 
{ 
    int l = 0; 
    int newPosition = array.Length -1; 
    for (int i = 0; i < array.Length; i++) 
    { 
     for (int j = i + 1; j < array.Length-l; j++) 
     { 
      if (array[i] == array[j]) 
      { 
       int temp = array[j]; 
       array[j] = array[newPosition]; 
       array[newPosition] = temp; 
       newPosition--; 
       l++; 
      } 
     } 
    } 
    Array.Resize(ref array, array.Length - l); 
} 
+1

是否允許以其他方式改變數組(如重新排序元素)?從你的例子中不清楚。如果答案是肯定的,那麼你可以做得更快。 – jamesdlin 2010-01-13 10:15:01

回答

3

你的代碼是越野車。嘗試對{1,1,1}運行它 - 我認爲它會返回{1,1}。

+1

+1如果找到重複項,則不應提前使用「j」。 – 2010-01-13 10:14:11

3

一般來說,這個問題是否必須保持元素的相對順序。例如,是否有可能爲{2,1,2,1}輸入返回{1,2}。

如果它被允許,則最快的解決方案將是:

  • 排序輸入數組
  • 通過它運行一次進行比較的[I]與[I + 1]和除去爲O重複( N)'

總複雜度爲O(N * logN),這比您提出的N^2要好。

如果您必須保留初始順序,那麼我還沒有準備好提出解決方案。

+0

請問我可以讓我如何刪除重複的元素。正如我已經使用Array.Resize,在這種情況下,當我將我與i + 1進行比較,那麼如果找到匹配,那麼我需要將i + 1移動到數組的末尾。在這種情況下,這是行不通的。可以說數組的內容1 1 1 3 3 5 ..然後在第一步1 1 3 3 5 1 - 從最後刪除1 - 現在數組是1 1 3 3 5.現在1將比較3和第二1不會被刪除。請幫忙 – 2010-01-13 10:52:26

+0

這絕對有可能。你只是不要立即交換元素 - 首先你要通過數組,將所有重複項替換爲零或數組中不存在的其他數字,並且只有在最後將所有元素轉移到它們各自的位置時,陣列。 – Olexiy 2010-01-13 12:33:27

1

上次我檢查了C#,允許您使用一個進行比較並在兩者上進行交換來排序2個數組。

這裏是你可以做什麼:

  • 創建存儲數字0到N-1的陣列indices
  • 排序arrayindices使用array作爲關鍵。
  • 找到重複項並將重複項的索引設置爲N + 1。
  • Sort array and indices using indices as key。
  • 將數組大小調整爲正確的大小和大小。

這將刪除重複並保留排序。