我创建了这个算法,它所做的就是找到具有相同产品的整数对,并且成对中的整数必须不同。产品不得超过1024.这是我能做到的最简单的方法,有没有办法可以提高算法的效率和时间复杂度?
由于
# java -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)
答案 0 :(得分:0)
您无法提高算法的时间复杂度。它是O(n^2)
,如果您要比较输入中的所有对,就可以做到这一点。
但这并不是说您无法改善运行时间。并非所有O(n^2)
算法都同样出色;通过让它做更少的工作,你可以让它运行得更快;在这种情况下,这基本上意味着跳过检查产品不能相等的数字。
将这些对放入具有相同产品的桶中:
Map<Integer, List<int[]>> map = new HashMap<>();
for (int i = 0; i < nums.length; ++i) {
for (int j = i+1; j < nums.length; ++j) {
if (nums[i] == nums[j] || nums[i]*nums[j] > 1024) continue;
map.computeIfAbsent(nums[i]*nums[j], ArrayList::new)
.add(new int[] {nums[i], nums[j]});
}
}
然后只迭代每个桶中的所有对对:
for (List<int[]> list : map.values()) {
for (int i = 0; i < list.size(); ++i) {
for (int j = 1; j < list.size(); ++j) {
System.out.printf(
"Matching pair found: %s %s%n",
Arrays.toString(list.get(i)),
Arrays.toString(list.get(j)));
}
}
}
在最坏的情况下,这仍然是O(n^2)
,这是所有数字对具有相同乘积的地方,这意味着对具有相等乘积的对的迭代只是迭代所有对。我怀疑这实际上是否可行,但是没有所有数字相等,检查禁止该数字中的数字是不同的。
您可以通过先排序nums
,然后在nums[i]*nums[j] > 1024
之后打破顶部内循环而不是继续来削减一些时间;这取决于nums
是否值得对其进行排序(如果您不想更改输入数组,可能会复制它)。