Given an array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
大意就是一个数组,只有一个出现了1次,其他都是成双出现
要求时间复杂度O(n),空间复杂度O(1)
解析:如果不要求时间复杂度,此题只需要逐个比较就行。时间复杂度为O(n2/2)
然而在时间复杂度规定O(n)下,需要用到亦或,即两数不相等为1,相等为0,且满足交换律:a^b = b^a,
所以只要将元素全部做亦或处理即可。
class Solution { public: int singleNumber(vector<int>& nums) { if(nums.size() == 0) return false; else if (nums.size() == 1) return nums[0]; int temp = nums[0]; for(int i=1; i<nums.size(); i++) { temp ^= nums[i]; } return temp; } };
思考:
1.如果题目要求把一次和两次,对应成基数次和偶数次。
亦或算法依旧可行。
普通算法则需要每个都行比较计数,时间复杂度时间复杂度为O(n2)
2.如果题目把一次和两次调换,则不能直接把亦或换成与。
http://www.cnblogs.com/changchengxiao/p/3413294.html
还有提到了其他的扩展情况。