题目描述
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例1:
输入: [2,2,1]
输出: 1
示例2:
输入: [4,1,2,1,2]
输出: 4
提示
- $$
- $$
- $$
- $$
- $$
方法一:排序 + 快慢指针
解题思路
先对 n u m s nums nums 数组排序,然后定义两个指针,因为重复的数字都是两个两个一出现,如果 s l o w slow slow 指针指向的数和 f a s t fast fast 指针指向的数不相等时,则 s l o w slow slow 指针则是只出现一次的数字。
代码
class Solution {
public:
int singleNumber(vector<int>& nums) {
if(nums.size() == 1) return nums[0];
sort(nums.begin(), nums.end());
int slow = 0, fast = 1;
while(nums[slow] == nums[fast]) {
slow += 2;
fast += 2;
}
return nums[slow];
}
};
复杂度分析
- 时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)。
- 空间复杂度: O ( 1 ) O(1) O(1)。
方法二:异或
解题思路
数组中的全部元素的异或运算结果即为数组中只出现一次的数字。
代码
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ans = nums[0];
if (nums.size() > 1) {
for (int i = 1; i < nums.size(); i++) {
ans = ans ^ nums[i];
}
}
return ans;
}
};
复杂度分析
- 时间复杂度: O ( n ) O(n) O(n)。
- 空间复杂度: O ( 1 ) O(1) O(1)。