内容简介:咱不是计算机专业的,却一直对计算机算法感兴趣,也一直致力于减小自己程序的复杂度[捂脸],昨日吃饭时,某老铁考我一道算法题,思索良久,辗转反侧,夜不能寐,遂厚着脸皮去问答案,然则令吾汗颜,果真是一波骚操作……给定一个非空整数数组, 除了某个元素只出现一次以外, 其余每个元素均出现两次, 找出那个只出现了一次的元素。你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
写在前面
咱不是计算机专业的,却一直对计算机算法感兴趣,也一直致力于减小自己程序的复杂度[捂脸],昨日吃饭时,某老铁考我一道算法题,思索良久,辗转反侧,夜不能寐,遂厚着脸皮去问答案,然则令吾汗颜,果真是一波骚操作……
看题!
给定一个非空整数数组, 除了某个元素只出现一次以外, 其余每个元素均出现两次, 找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
看答案之前,不妨独立思考一下,看看能不能想出解决方案!
推荐先想一会儿!
如果实在想不出来, 可以看一下提示 继续想 !!
提示
看一下标题!!!
题目解析
根据题目描述,由于加上了 时间复杂度必须是O(n) ,并且 空间复杂度为O(1) 的条件,因此 不能用 排序 方法 ,也 不能使用map数据结构 。
咱想了一晚上,结果, 答案是使用 位操作Bit Operation 来解此题。
将所有元素做 异或 运算,即 a[1] ⊕ a[2] ⊕ a[3] ⊕...⊕ a[n] ,而结果就是那个只出现一次的数字,时间复杂度为O(n)。
什么??你忘记了 异或 ???
异或运算 A ⊕ B 的真值表如下:
| A | B | A ⊕ B |
|---|---|---|
| False | False | False |
| True | True | True |
| True | False | True |
| False | True | True |
即:不相等即为 True
题目进阶
有一个 n 个元素的数组,除了两个数只出现一次外,其余元素都出现两次,让你找出这两个只出现一次的数分别是几,要求时间复杂度为 O(n) 且 再开辟的内存空间固定(与 n 无关) 。
示例:
输入: [1,2,2,1,3,4]
输出: [3,4]
题目再解析
根据前面找 一个 不同数的思路算法,在这里把所有元素都异或,那么得到的结果就是 那两个只出现一次的元素异或的结果 , 为了叙述方便 , 我们这里把这个结果简单记为字母 K 。
因为这两个只出现一次的元素一定是不相同的,所以 K 一定不为零, 将 K 从左往右数的第一个为1的位记录下来。
再然后,以这一位是 1 还是 0 为标准,将数组的 n 个元素分成两部分。
将这一位为 0 的所有元素做异或,得出的数就是只出现一次的数中的一个
将这一位为 1 的所有元素做异或,得出的数就是只出现一次的数中的另一个。
这样就解出题目, 忽略寻找不同位的过程 ,总共遍历数组两次,时间复杂度为O(n)。
据说此题来源于 LeetCode 第 136 号问题: https://leetcode-cn.com/probl...
还在修改中...
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 通俗易懂--决策树算法、随机森林算法讲解(算法+案例)
- 限流算法之漏桶算法、令牌桶算法
- 什么是Paxos算法?Paxos算法是区块链核心算法之一
- 一文读懂对称加密算法、非对称加密算法和Hash算法
- 算法(六):图解贪婪算法
- 算法篇03:排序算法
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
An Introduction to Genetic Algorithms
Melanie Mitchell / MIT Press / 1998-2-6 / USD 45.00
Genetic algorithms have been used in science and engineering as adaptive algorithms for solving practical problems and as computational models of natural evolutionary systems. This brief, accessible i......一起来看看 《An Introduction to Genetic Algorithms》 这本书的介绍吧!