Java学习笔记
Leetcode刷题经验
热题HOT100
136、只出现一次的数字
该题对时间复杂度和空间复杂度都有一定的限制,故不能使用下面三种方法:
上述三种解法都需要额外使用
O
(
n
)
O(n)
O(n)的空间,其中
n
n
n 是数组长度。如果要求使用线性时间复杂度和常数空间复杂度,上述三种解法显然都不满足要求。
解题思路:
这里可以采用位运算(异或运算)的思路与算法:
- 因为异或运算具有如下的三个性质:
那么我们根据这三个性质,可以将数组中的所有元素进行异或运算,最后经过交换和结合律肯定可以变成如下的这种形式:
时间复杂度: O ( N ) O(N) O(N),其中 N N N 是 数组的长度;空间复杂度: O ( 1 ) O(1) O(1)。
class Solution {
public int singleNumber(int[] nums) {
int single=0;
for(int num: nums){
single^=num;
}
return single;
}
}
欢迎大家交流,一起进步!