要求线性时间复杂度,如果使用额外空间(比如哈希表set/map)的话,就很简单。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int sum = 0;
unordered_set<int> set;
for(int i = 0; i < nums.size(); ++i){
sum += nums[i];
set.insert(nums[i]);
}
int val = 0;
return accumulate(set.begin(), set.end(), val) * 2 - sum;
}
};
但是如果不使用额外空间的话,一时还想不到什么方法。
那就看看题目标签吧:位运算,哈希表。
看到位运算,就大体了解应该使用位异或:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int sum = nums[0];
for(int i = 1; i < nums.size(); ++i) sum ^= nums[i];
return sum;
}
};
本文详细解析了LeetCode题目136.只出现一次的数字,介绍了两种解决方案:一种使用额外空间如哈希表进行线性时间复杂度的查找;另一种则利用位运算中的异或操作,实现不使用额外空间的高效求解。通过对比,突出了位运算在特定场景下的优势。


457

被折叠的 条评论
为什么被折叠?



