唯一的元素

描述:给定一个无序的数组,其中数组只有一个数是唯一的,其余的数都是两两成对,找出这个唯一的数。

输入: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;
	}
}; 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值