【发布时间】:2021-03-14 20:19:01
【问题描述】:
我正在寻找一种有效的方法来打印出在某些条件下总和为目标值的两个整数:
- 第一个 int 应该小于第二个 int 对
- 打印应该按对中的第一个升序进行
我编了一些意大利面条,在时间复杂度上似乎比两个循环更有效,但是,它不包括排序。目前我的想法已经用完了。
我的问题如下:
- 对输出进行排序的最佳方法是什么?
- 除了我目前的解决方案之外,还有其他方法可以提高时间复杂度吗?
PS。输入输出将是大量的整数,所以我想知道是否应该替换 System.out.println。
提前谢谢你。
编辑: 我必须打印出所有的配对。一个 int 可以是多对。输入可以增长到几十万个 int。
给定目标 12: 示例输入: 2 10 0 8 4 12 8
示例输出: 0 12 2 10 4 8 4 8
public static void myFindPair(int[] arr, int target) {
// Key = difference, value = index
Map<Integer, Integer> map = new HashMap();
for (int i = 0; i < arr.length; i++) {
int difference = target - arr[i];
map.put(difference, i);
System.out.print(arr[i]);
}
for (int i = 0; i < arr.length; i++) {
if (map.containsKey(arr[i]) && map.get(arr[i]) != i) {
int first = arr[i];
int second = arr[map.get(arr[i])];
if (first < second) {
System.out.println(first + " " + second);
}
}
}
}
【问题讨论】:
-
你需要找到所有这样的对还是只找到一个?
-
添加一些示例输入和输出。
-
如果第一个 int 小于第二个 int,则这两个值按定义按升序排列,那么 2 个项目符号不只是在说同样的事情吗?
-
请分享更多细节。你的代码有什么不工作的地方吗?
-
请务必提及问题的约束。 数组的最大长度是多少?数组元素的最大大小是多少? 如果约束不是太大,你的问题可以在
O(n)中解决。如果它们足够大,O(n*log n)是我所知道的最佳解决方案。