簡體   English   中英

數組相關問題的時間復雜度

[英]Time complexity for the array related problem

給定一個由 N 個整數組成的非空數組 A。 該數組包含奇數個元素,並且該數組的每個元素都可以與另一個具有相同值的元素配對,除了一個未配對的元素。

例如,在數組 A 中,這樣:

A[0] = 9 A[1] = 3 A[2] = 9 A[3] = 3 A[4] = 9 A[5] = 7 A[6] = 9 索引 0 和 2 處的元素具有值 9,索引 1 和 3 處的元素具有值 3,索引 4 和 6 處的元素具有值 9,索引 5 處的元素具有值 7 並且未配對。 寫一個 function:

class 解決方案 { public int solution(int[] A); }

即,給定一個由滿足上述條件的 N 個整數組成的數組 A,返回未配對元素的值。

例如,給定數組 A 使得:

A[0] = 9 A[1] = 3 A[2] = 9 A[3] = 3 A[4] = 9 A[5] = 7 A[6] = 9 function 應該返回 7,如解釋在上面的例子中。

為以下假設編寫一個有效的算法:

N 是 [1..1,000,000] 范圍內的奇數 integer; 數組 A 的每個元素都是 [1..1,000,000,000] 范圍內的 integer; A 中除一個值外的所有值均出現偶數次。

我的解決方案

我的解決方案在這些情況下失敗了,我願意從 SO 社區指導我如何思考這個問題,以便我能夠克服這些失敗

class Solution {
    public int solution(int[] A) {
       int[] result = new int[(int) Math.ceil((double)A.length/2)];
       for(int x = 0 ; x < result.length ; x++ ){
           result[x] = -1;
       }
       for(int x = 0 ; x < A.length ; x++ ){
           for(int y = 0 ; y < result.length ; y++){
               if(result[y] > -1  && result[y]== A[x])
               {
                   result[y] = -2;
                   break;
               }
               if(result[y] == -1 )
               {
                   result[y] = A[x];
                   break;
               }
           }
       }

       for(int x = 0 ; x < result.length ; x++ ){
           if(result[x] > -1){
           return result[x];
           }
       }
       return -1;
    }
}

失敗

中等隨機測試 n=100,003 被殺死。 達到硬限制:7.000 秒。

大隨機測試 n=999,999,多次重復被殺。 達到硬限制:14.000 秒。

大隨機測試 n=999,999 被殺死。 達到硬限制:19.000 秒。

如果保證輸入只有一個不成對的元素,那么通過對所有元素進行異或來識別它是非常簡單的。

int x = A[0];
for ( int i = 1; i < A.length; i++ )
     x = x ^ A[i];

結果值是未配對的值。

例子:

public static void main (String[] args) throws java.lang.Exception
    {
        int[] A = {9, 3, 9, 2, 4, 2, 4, 7, 3};
        int x = A[0];
        for ( int i = 1; i < A.length; i++ )
            x = x ^ A[i];
        System.out.println(x);
    }

Output 為 7。

時間復雜度為O(n)

這是有效的,因為數字與自身的 XOR 為零。

最有效的解決方案利用了按位異或運算的有趣特性:

a xor a = 0

對於a的任何值,因此對所有數組項進行異或運算只會給出未配對的值

public int solution(int[] A) {
   int result = 0;
   for(int x = 0 ; x < A.length ; x++ )
       result ^= A[x];
   return result;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM