逻辑运算符在减少时间复杂度上的使用

以下两个题目来源于Leetcode:

1.Single number

Given an array of integers, every element appears twice except for one. Find that single one.
Note: Your algorithm should have a linear runtime complexity. Could you implement it without using
extra memory?

一般的思路是取数组中的每一个数进行遍历,如果能找到则不是,如果找不到相同的数说明找到该单个值。很显然时间复杂度为O(n^n),题目要求时间复杂度为线性的,此种方法行不通,如何做到对数组只遍历一次即可找到结果?方法是采用逻辑运算符实现。

原理是a^b=b^a;a^0=a;a^a=0。这样以来只需要把数组里的每一个进行异或得到的结果就是出现单次的那个值,同样该方法还适合于出现奇数次的值的查询,因为相同的数出现偶次后异或的结果是0,出现奇数次的数最后的形式就是0^a=a,a就是那个出现奇数次的那个数,代码如下:

class Solution {

public:

int singleNumber(int A[], int n) {

int x = A[0];

for (size_t i = 1; i < n; ++i)

x ^= A[i];

return x;

}

};

2.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?

这里一个数出现1次,其他的数出现3次,无法使用上述方法,解题思路是对每一位进行计数,如果一个数出现3次,则该位对应的值模3结果为0,否则出现一次的模3结果为其本身,这样即可得出结果,代码如下:

class Solution { 
public:

int
singleNumber(int A[],int n) { int bitArray[32] = {0}; int res = 0; for(int i = 0;i < 32;i++) { for(int j = 0;j < n;j++) { bitArray[i] += (A[j]>>i)&1; } res |= (bitArray[i]%3)<<i; } return res; }

 

你可能感兴趣的:(时间复杂度)