【发布时间】:2021-09-26 20:44:13
【问题描述】:
问题陈述: 给定一个非负整数数组,计算无序数组元素对的数量,使得它们的按位与是 2 的幂。
例子: arr = [10, 7, 2, 8, 3]
答案: 6 (10&7, 10&2, 10&8, 10&3, 7&2, 2&3)
约束:
1 <= arr.Count <= 2*10^5
0 <= arr[i] <= 2^12
这是我想出的蛮力解决方案:
private static Dictionary<int, bool> _dictionary = new Dictionary<int, bool>();
public static long CountPairs(List<int> arr)
{
long result = 0;
for (var i = 0; i < arr.Count - 1; ++i)
{
for (var j = i + 1; j < arr.Count; ++j)
{
if (IsPowerOfTwo(arr[i] & arr[j])) ++result;
}
}
return result;
}
public static bool IsPowerOfTwo(int number)
{
if (_dictionary.TryGetValue(number, out bool value)) return value;
var result = (number != 0) && ((number & (number - 1)) == 0);
_dictionary[number] = result;
return result;
}
对于小输入,这工作正常,但对于大输入,这工作缓慢。 我的问题是:该问题的最佳(或至少更佳)解决方案是什么?请在 C# 中提供一个优雅的解决方案。 ????
【问题讨论】:
-
在这里使用字典只会让事情变慢。
-
@Olivier 我虽然对于更大的输入,尤其是在大量重复的情况下,这会更快。但是对于大输入,带或不带字典的两个版本都运行缓慢
标签: c# .net algorithm optimization bitwise-operators