码迷,mamicode.com
首页 > 其他好文 > 详细

[leetcode-260-Single Number III]

时间:2017-06-09 23:40:30      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:linear   log   思路   ups   ash   port   ++   lin   ace   

Given an array of numbers nums, in which exactly two elements appear only once and all the other elements appear exactly twice.
Find the two elements that appear only once.
For example:
Given nums = [1, 2, 1, 3, 2, 5], return [3, 5].
Note:
The order of the result is not important. So in the above example, [5, 3] is also correct.
Your algorithm should run in linear runtime complexity.
Could you implement it using only constant space complexity?

思路:

1.assume that A and B are the two elements which we want to find;

2.use XOR for all elements,the result is : r = A^B,we just need to distinguish A from B next step;

3.if we can find a bit ‘1‘ in r,then the bit in corresponding position in A and B must be different.We can use {last = r & (~(r-1))} to get the last bit 1 int r;

4.we use last to divide all numbers into two groups,then A and B must fall into the two distrinct groups.XOR elements in eash group,get the A and B.

vector<int> singleNumber1(vector<int>& nums) {
         int r = 0, n = nums.size(), i = 0, last = 0;
         vector<int> ret(2, 0);

         for (i = 0; i < n; ++i)
             r ^= nums[i];

         last = r & (~(r - 1));
         for (i = 0; i < n; ++i)
         {
             if ((last & nums[i]) != 0)
                 ret[0] ^= nums[i];
             else
                 ret[1] ^= nums[i];
         }

         return ret;
     }

参考:

https://discuss.leetcode.com/topic/34545/share-my-c-solution

[leetcode-260-Single Number III]

标签:linear   log   思路   ups   ash   port   ++   lin   ace   

原文地址:http://www.cnblogs.com/hellowooorld/p/6973929.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!