Java 阵列相关问题的时间复杂性
给出了一个由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社区,请指导我如何思考这个问题,以便我能够克服这些失败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,返回
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)解。