Java 阵列相关问题的时间复杂性

Java 阵列相关问题的时间复杂性,java,algorithm,time-complexity,Java,Algorithm,Time Complexity,给出了一个由N个整数组成的非空数组A。数组包含奇数个元素,数组中的每个元素都可以与具有相同值的另一个元素配对,只有一个元素未配对 例如,在数组中: A[0]=9A[1]=3A[2]=9 A[3]=3A[4]=9A[5]=7 A[6]=9 索引0和2处的元素的值为9, 索引1和3处的元素的值为3, 索引4和6处的元素的值为9, 索引5处的元素的值为7且未配对。 编写一个函数: 类解决方案{public int Solution(int[]A);} 给定一个由满足上述条件的N个整数组成的数组A,返回

给出了一个由N个整数组成的非空数组A。数组包含奇数个元素,数组中的每个元素都可以与具有相同值的另一个元素配对,只有一个元素未配对

例如,在数组中:

A[0]=9A[1]=3A[2]=9 A[3]=3A[4]=9A[5]=7 A[6]=9 索引0和2处的元素的值为9, 索引1和3处的元素的值为3, 索引4和6处的元素的值为9, 索引5处的元素的值为7且未配对。 编写一个函数:

类解决方案{public int Solution(int[]A);}

给定一个由满足上述条件的N个整数组成的数组A,返回未配对元素的值

例如,给定一个数组,使得:

A[0]=9A[1]=3A[2]=9 A[3]=3A[4]=9A[5]=7 A[6]=9 该函数应返回7,如上面示例中所述

为以下假设编写有效的算法:

N是范围[1..1000000]内的奇数整数; 数组A的每个元素都是[1..100000000]范围内的整数; 除一个值外,所有值都会出现偶数次

我的解决方案

我的解决方案在这些情况下失败,我愿意来自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;
    }
}
类解决方案{
公共int解决方案(int[]A){
int[]result=newint[(int)Math.ceil((double)A.length/2)];
对于(int x=0;x-1&&result[y]==A[x])
{
结果[y]=-2;
打破
}
如果(结果[y]=-1)
{
结果[y]=A[x];
打破
}
}
}
对于(int x=0;x-1){
返回结果[x];
}
}
返回-1;
}
}
失败

中等随机试验n=100003 被杀死的。已达到硬限制:7.000秒

大随机试验n=999999,多次重复 被杀死的。已达到硬限制:14.000秒

大随机试验n=999999
被杀死的。达到硬限制:19.000秒。

如果保证输入只有一个未配对的元素,则通过对所有元素进行异或来识别它非常简单

int x = A[0];
for ( int i = 1; i < A.length; i++ )
     x = x ^ A[i];
intx=A[0];
for(int i=1;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);
    }
publicstaticvoidmain(字符串[]args)抛出java.lang.Exception
{
int[]A={9,3,9,2,4,2,4,7,3};
int x=A[0];
for(int i=1;i
产量为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;
}
public int解决方案(int[]A){
int结果=0;
对于(int x=0;x
由于大输入的大小为1000000,您必须考虑如何在线性或最坏的O(n logn)时间内求解它。通常,只有当最大的测试用例的大小在1000左右时,网站编程问题才有O(n^2)解。