LeetCode(137) Single Number II
2015-10-22 13:19
176 查看
题目
Given an array of integers, every element appears three times except for one. Find that single one.Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
分析
由上一题改动而来,LeetCode 136 Single Number描述的是:数组中其他数出现两次,仅有一个出现一次的,直接用所有元素异或就行了(只要是偶数次,都可以用这个方法),本题变为其他元素出现3次,而且时间复杂度要求线性,空间为常数。用排序的方法依然可以简单解决,但是复杂度不符合线性的要求。而且,此题不能简单的用异或运算实现了。
看到了一个具有很棒实现方法的帖子:LeetCode 137 Single Number II,提供了两种方法,受益匪浅。
AC代码
class Solution { public: /*利用算法库的排序实现,复杂度为O(nlogn)*/ //int singleNumber(vector<int>& nums) { // if (nums.empty()) // return -1; // sort(nums.begin(), nums.end()); // int size = nums.size(); // for (int i = 0; i < size - 2; i+=3) // { // if (nums[i] != nums[i + 1]) // return nums[i]; // } // return nums[size - 1]; //} /* 方法二: * int 数据共有32位,可以用32变量存储这 N 个元素中各个二进制位上 1 出现的次数, * 最后 在进行 模三 操作,如果为1,那说明这一位是要找元素二进制表示中为 1 的那一位。 * 时间:O(32*N),这是一个通用的解法,如果把出现3次改为 k 次,那么只需模k就行了 */ //int singleNumber(vector<int>& nums) { // if (nums.empty()) // return -1; // vector<int> bitnum(32, 0); // int res = 0 , size = nums.size(); // for (int i = 0; i < 32; i++){ // for (int j = 0; j < size; j++){ // bitnum[i] += (nums[j] >> i) & 1; // } // res |= (bitnum[i] % 3) << i; // } // return res; //} /* 方法三: * 利用三个变量分别保存各个二进制位上 1 出现一次、两次、三次的分布情况,最后只需返回变量一。 */ int singleNumber(vector<int>& nums) { if (nums.empty()) return -1; int size = nums.size(); int one = 0, two = 0, three = 0; for (int i = 0; i < size; i++){ two |= one&nums[i]; one ^= nums[i]; //cout<<one<<endl; three = one&two; one &= ~three; two &= ~three; } return one; } };
GitHub测试程序源码
相关文章推荐
- Linux进程实时IO监控iotop命令详解 (系列一)
- 九度OJ 1075:斐波那契数列 (数字特性)
- 九度OJ 1075:斐波那契数列 (数字特性)
- LeetCode(137) Single Number II
- 关于C# IEnumerator、yield、Unity3D协程的一些东西
- 基于链式存储的栈
- opencv读取文件路径
- Size Balanced Tree
- 屏蔽OTA包的时间戳检测
- spring整合struts2
- 【动态规划】【图论】[NOIP模拟赛]独立集
- cocos2d-x 3.0 开发环境搭建(win7/win8)
- 第四次作业——个人作业——软件案例分析
- 运行和控制Nginx
- Iterate HTTP request headers
- 九度OJ 1074:对称平方数 (数字特性)
- 10个帮程序员减压放松的网站
- CSS实现完美垂直居中
- 九度OJ 1074:对称平方数 (数字特性)
- NYOJ 1185 最大最小值(线段树—区间求最值)