【Leetcode 136】Single Number
问题描述:给出一个整数数组,除了一个元素外,其他每个元素都出现了2次,找出只出现1次的元素。
int singleNumber(vector<int>& nums);
分析:比较自然的想法是用一个容器来进行插入、查找、删除操作。遍历nums,先查找容器中是否包含该元素,是则插入,否则删除。最后容器中只剩下只出现1次的元素。
解法:
int singleNumber(vector<int>& nums) {
int i = 0;
unordered_set<int> temp;
for (auto i : nums)
{
if (temp.count(i))
temp.erase(i);
else
temp.insert(i);
}
return *(temp.begin());
} // 15/15 44ms 8.57%
因此只需要选择适当的容器,set显然适合执行这个任务,但是其实unordered_set(无序集)效率更佳,使用哈希表比维护一颗二叉平衡树(STL是红黑树)要省时,对比时间:无序集是20ms,有序集是44ms。
会占用不确定的额外空间,最好是1,最坏是n / 2。
更合适且高效的做法:
当然是位运算了……(发现通过率最高的几个都是用到位运算的小花招)
利用XOR运算进行2次会还原的性质,即a ^ b ^ b = a,对整个序列依次XOR运算完毕后得到的就是a0 ^ ret,a0为初始值,ret为返回值,设a0为0即可。
利用lambda表达式可以一行完成。
int singleNumber(vector<int>& nums) {
return accumulate(nums.begin(), nums.end(), 0,
[](int a, int b) { return a ^ b; });
} // 15/15 20ms 26.77%
上述方法需要1个额外空间,其实实际应用来说基本相当于没有。但是其实也可以不用额外空间,也就是从nums第一个元素开始累积,这就需要考虑特殊情况,nums只有1个元素。
int singleNumber(vector<int>& nums) {
int len = nums.size();
if (len == 1)
return nums[0];
auto& ret = nums[0];
for (int i = 1; i < len; ++i)
ret ^= nums[i];
return ret;
} // 15/15 20ms 26.77%
【Leetcode 136】Single Number的更多相关文章
- 【LEETCODE OJ】Single Number II
Problem link: http://oj.leetcode.com/problems/single-number-ii/ The problem seems like the Single Nu ...
- 【LEETCODE OJ】Single Number
Prolbem link: http://oj.leetcode.com/problems/single-number/ This prolbem can be solved by using XOR ...
- [LeetCode#136, 137]Single Number, Single Number 2
The question: Single Number Given an array of integers, every element appears twice except for one. ...
- 【LeetCode OJ 136】Single Number
题目链接:https://leetcode.com/problems/single-number/ 题目:Given an array of integers, every element appea ...
- 【leetcode 136】136. Single Number
要求:给定一个整数数组,除了其中1个元素之外,其他元素都会出现两次.找出这个只出现1次的元素. 例: array =[3,3,2,2,1] 找出元素1. 思路:最开始的想法是用两次for循环,拿 ...
- 【LeetCode】【Python题解】Single Number & Maximum Depth of Binary Tree
今天做了三道LeetCode上的简单题目,每道题都是用c++和Python两种语言写的.由于c++版的代码网上比較多.所以就仅仅分享一下Python的代码吧,刚学完Python的基本的语法,做做Lee ...
- leetcode@ [136/137] Single Number & Single Number II
https://leetcode.com/problems/single-number/ Given an array of integers, every element appears twice ...
- leetcode 136、Single Number
Given a non-empty array of integers, every element appears twice except for one. Find that single on ...
- 【LeetCode #179】Largest Number 解题报告
原题链接:Largest Number 题目描述: Given a list of non negative integers, arrange them such that they form th ...
随机推荐
- java程序设计基础篇 复习笔记 第二单元
1原始数据类型(primitive data type) == 基本类型 (fundamental type)byte short int long float double char boolean ...
- hdu 4081 Qin Shi Huang's National Road System 树的基本性质 or 次小生成树思想 难度:1
During the Warring States Period of ancient China(476 BC to 221 BC), there were seven kingdoms in Ch ...
- eclipse背景设置什么颜色缓解眼睛疲劳之一
Eclipse操作界面默认颜色为白色.对于我们长期使用电脑编程的人来说,白色很刺激我们的眼睛,如果把颜色改成绿色的颜色就会缓解眼睛的疲劳. 设置方法如下: 1.打开window->Prefere ...
- 慕课网-Linux达人养成计划学习笔记
mkdir -p [目录]创建目录-p 递归创建ls 查看当前目录下的文件和目录等其他文件 cd [目录]命令英文愿意:change directory切换所在目录简化操作cd ~ 进入当前用户的家目 ...
- DataTable和实体类通过反射相互转换
using System.Runtime.Serialization; using System.Data; using System.Reflection; using System.Collect ...
- Linux:uniq命令详解
uniq uniq命令用于报告或忽略文件中的重复行,一般与sort命令结合使用. 语法 uniq(选项)(参数) 选项 -c或——count:在每列旁边显示该行重复出现的次数: -d或--repeat ...
- for循环打印等腰三角形、直角三角形、菱形
一.等腰三角形 package s1; import java.util.Scanner; public class C31 { public static void main(String[] ar ...
- jfc在jsp页面画图,不将图片存在服务器端,只存入会话session(可用)
jfc在jsp页面画图,不将图片存在服务器端,只存入会话session.其中主要用到jfc的一个servlet类. <%@ page contentType="text/html;ch ...
- ES6-块级作用域绑定-let和const
一.var声明及变量提升机制 var声明,无论实际上在哪里声明,都会被当做在当前作用域顶部声明的变量,这就是变量提升机制. 二.块级声明 块级声明用于声明在指定块的作用域之外无法访问的变量.块级作用域 ...
- UE4 引擎基础类说明
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/76048437 作者:car ...