LeetCode 136. Single Number

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

还有提到了其他的扩展情况。


你可能感兴趣的:(LeetCode,LeetCode,number,single,single,136.,136.)