线性时间复杂度:时间复杂度最高为O(n)
不使用额外空间:空间复杂度最高为O(1)
方法一:异或法(所有数字在二进制下相与结果为落单的数字)
int singleNumber(vector<int>& nums) {
int num = 0;
for (int i = 0; i < nums.size(); i++)
{
num = num ^ nums[i];
}
return num;
}
方法二:(使用STL中set,当二次插入时set返回类型(pair)中提取false,删除set中元素。最后将只剩落单元素)
int singleNumber(vector<int>& nums) {
set<int> has;
for (int i = 0; i < nums.size(); i++)
{
bool bo = has.insert(nums[i]).second; //返回pair类型
if (bo == false)
{
has.erase(nums[i]);
}
}
for(auto m : has)
return m;
}
利用了HashSet集合不可重复的特性,其实HashSet的底层是通过HashMap来实现的。调用的 resize() 、 putTreeVal() 等方法本身也是O(n2)的时间复杂度。不符合题目要求的线性时间复杂度。
方法三:(重新排序)
int singleNumber(vector<int>& nums) {
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size() - 1; i += 2)
if (nums[i] != nums[i + 1])
return nums[i];
return nums[nums.size() - 1];
}
不符合题目要求的线性时间复杂度。