给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
示例 1:
输入:nums = [2,2,3,2]
输出:3
示例 2:
输入:nums = [0,1,0,1,0,1,100]
输出:100
提示:
1 <= nums.length <= 3 * 104
-231 <= nums[i] <= 231 - 1
nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次
进阶:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
看到这个题,第一反应就是两种方法,一种是最简单粗暴的遍历每个元素然后计数,这样的时间复杂度是
O
(
n
2
)
O(n^2)
O(n2),空间复杂度为O(1);第二种方法就是用哈希表,申请个map来存储元素,遍历一遍nums数组就可以了,时间复杂度
O
(
n
)
O(n)
O(n),空间复杂度
O
(
n
)
O(n)
O(n)。
方法一太简单粗暴,就不写代码了,附上方法二代码:
class Solution {
public:
int singleNumber(vector<int>& nums) {
unordered_map<int,int> fraq;
for(int num:nums)
{
++fraq[num];
}
int result;
for(auto[key,value]:fraq)
{
if(value==1)
{
result = key;
break;
}
}
return result;
}
};
题目的进阶要求是不申请额外数组,这个就让我很没有头绪,然后看了官方解法,直接给我整麻了,太强了也。
官方解法