描述:给定一个无序的数组,其中数组只有一个数是唯一的,其余的数都是两两成对,找出这个唯一的数。
输入:Array={1,2,3,2,1,5,3}。
输出:5
思路一:先将数组排序,然后从第一个元素开始,依次判断当前元素是否与后一位相同。若相同则前进两位,否则输出当前元素。时间复杂度为排序复杂度,空间复杂度为1。
class Solution{
public:
int singleNumber(int A[],int n)
{
if(n%2==0) return -1;
sort(A,A+n);
for(int i=0;i<n-1;i+=2)
{
if(A[i]=A[i+1])
return A[i];
}
}
};
思路二:使用哈希表,key=元素在数组中的索引,value=元素的数值。若在表中找到该元素则删除<key,value>对,若找不到则添加。遍历结束后,表中剩下的即是数组中唯一的元素。时间复杂度为线性,空间复杂度为线性。
class Solution{
public:
int singleNumber(int A[],int n)
{
map<int,int>hash;
for(int i=0;i<n;i++)
{
if(hash.find(A[i])==hash.end())
{
hash[i]=A(i);
}
else
{
hash.erase(hash.find(A[i]));
}
}
}
return hash[hash.begin()];
}
};
思路三:由思路二得到启发,在哈希表中,若找不到当前元素,则添加若找到了则删除。由于除了所求唯一元素其余元素都是两两成双,可以将数组中所有元素做异或运算,由于两个相同的数字的异或为0,0与其他数的异或即原值,则可求得唯一元素。可将该方法拓展到一个数组中,求出现奇数次的元素,其余元素出现次数为偶数次等相似问题。时间复杂度为线性,空间复杂度为1.
class Solution{
public:
int singleNumber(int A[],int n)
{
if(n%2==0)return -1;
int x=A[0];
for(int i=1;i<n;i++)
x^=A[i];
return x;
}
};