如何解决数组中满足按位方程的对数
我在一次比赛中发现了这个问题。问题是:
给定一个由 N
非负整数 (A1,A2,A3,...,An) 和一个整数 M
组成的数组。您的任务是找到满足以下按位方程的无序数组元素对 (X,Y)
的数量:
2 * set_bits(X|Y) = M + set_bits(X ⊕ Y)
注意:
-
set_bits(n)
表示整数 n 的二进制表示中 1 的数量。 -
X|Y
表示整数 X 和 Y 的按位或。 -
X ⊕ Y
表示整数 X 和 Y 的按位异或。 - 数组元素的无序对是pair
(Ai,Aj)
,其中1 ≤ i 。
打印满足上述按位方程的无序数组元素对的数量。
-
样本输入 1:
N=4 M=2
arr = [3,4,5]
样本输出:2
2 对是 (3,0) 和 (0,5) -
样本输入 2:
N=8 M=2
arr = [3,5,6,8,1,8]
样本输出:9
除了brute force
之外还有其他方法可以解这个方程吗?
解决方法
如果 O(n)
的时间复杂度为 set_bits
,则存在时间复杂度为 O(1)
的解决方案。
首先,我们将稍微改写条件(按位方程)。假设给出了一对元素 (X,Y)
。 c_01
代表 X 为 0 但 Y 为 1 的位数,c_10
代表 X 为 1 且 Y 为 0 的数字位数,c_11
代表其中的位数X 和 Y 为 1。例如,当 X=5
和 Y=1
(X=101,Y=001),c_01 = 0
,c_10 = 1
,c_11 = 1
。现在,条件可以改写为
2 * (c_01 + c_10 + c_11) = M + (c_01 + c_10)
因为set_bits(X|Y)
等于c_01 + c_10 + c_11
并且set_bits(X^Y)
等于c_01 + c_10
。
我们可以将方程重新排序为
c_01 + c_10 + 2*c_11 = M
通过将右侧的术语移动到左侧。现在,意识到 set_bits(X) = c_10 + c_11
。将此信息应用于我们得到的方程
c_01 + c_11 = M - set_bits(X)
现在,还要意识到 set_bits(Y) = c_01 + c_11
。方程变为
set_bits(Y) = M - set_bits(X)
或
set_bits(X) + set_bits(Y) = M
问题已经变成计算对的数量,使得第一个元素中的设置位数加上第二个元素中的设置位数等于 M
。假设您可以在恒定时间内计算 set_bits
,这可以在线性时间内完成。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。