136.只出现一次的数字
作者:互联网
**
说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
**
使用快排,复杂度 O(nlogn),不满足题目的时间和空间的复杂度要求
class Solution {
public:
int singleNumber(vector<int>& nums) {
sort(nums.begin(), nums.end());
int flag = 0, i;
for(i = 0; i < nums.size() - 1; i += 2){
if(nums[i] != nums[i + 1]){
flag = 1;
break;
}
}
if(flag)
return nums[i];
else
return nums[nums.size() - 1];
}
};
利用 Hash 表,Time: O(n) Space: O(n) 这里就用到了额外的空间
看了下解答有个老哥说不需要额外空间的方法,就往位运算上想
还记得之前在写题解中提到了相同为1,不同为0,这里确实有异或的思想在里面。
异或运算的性质
异或运算有以下三个性质。
1.任何数和 0 做异或运算,结果仍然是原来的数,即 a ⊕ 0= a ⊕ 0 = a。
2.任何数和其自身做异或运算,结果是 0,即 a ⊕ a = 0。
3.异或运算满足交换律和结合律,即 a ⊕ b ⊕ a = b ⊕ a ⊕ a = b ⊕ ( a ⊕ a )= b ⊕ 0 = b。
所以由于性质3可以对数组中所有的数进行异或运算之后就会等于一个落单的数了。
复杂度分析
时间复杂度:O(n),其中 n 是数组长度。只需要对数组遍历一次。
空间复杂度:O(1)。
所以可以得到代码如下
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ret = 0;
for(int i = 0; i < nums.size(); i++)
ret ^= nums[i];
return ret;
}
};
标签:一次,return,数字,nums,int,复杂度,异或,136,运算 来源: https://blog.csdn.net/AK416A4/article/details/116596112