有没有一种方法可以不使用嵌套循环来确定数组中是否有特定的和?(爪哇)
所以这段代码可以工作,但我想知道如果我不想使用嵌套循环,该怎么做?如果我们能坚持基本原则,我们将不胜感激!呵呵:>
编辑:要输入的列表已按升序排序,如果有帮助的话
import java.util.*;
class Tuple {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Enter the number of distinct elements in sorted array: ");
int size = sc.nextInt();
System.out.print("Enter " +size+ " elements: ");
int[] arr = new int[size];
for (int i = 0; i<size; i++) {
arr[i]=sc.nextInt();
}
System.out.print("Enter key: ");
int key = sc.nextInt();
if (checkTuple(arr, key)) {
System.out.println("Exist");
} else {
System.out.println("Not exist");
}
}
// method , returns true if there exists at least 1 pair of integers
//whose sum equals key, or false otherwise
public static boolean checkTuple(int[] arr, int key) {
int[] remainder = new int[arr.length];
for (int i=0; i<arr.length; i++) {
for (int j=0; j<arr.length; j++) {
if (arr[i]+arr[j]==key) {
return true;
}
}
}
return false;
}
}
# 1 楼答案
不需要存储阵列。在读取元素时,只需检查是否有匹配的对。当然,你需要提前索要钥匙
(我意识到这几乎肯定是一个家庭作业问题,目的不是找出一对是否存在,而是编写
checkTuple
方法,但如果目的仅仅是找出一对是否存在,这种方法既节省时间又节省空间。)# 2 楼答案
如果不允许一个数字使用两次,则需要创建一个映射,记录数组中每个数字的出现次数:
然后,循环浏览地图的关键点:
# 3 楼答案
你可以用下面的方法来做。它只有一个循环
arr
输入参数必须按升序排序该算法依赖于数组被排序的事实
首先,我们总结数组的第一个和最后一个元素。如果我们想要的和低于当前对的和,在这种情况下,我们需要减少正确的索引。否则,如果期望的和高于当前对的和,在这种情况下,我们必须增加左索引
所以,在最坏的情况下,我们将只遍历整个阵列一次。因此,复杂性将是O(n)
# 4 楼答案
是的,你可以在
O(n)
比如
有输出
# 5 楼答案
我想指出的是,您没有在代码中使用余数数组。 你可以用这样的方法来代替这个方法
只需去掉for循环,将
j
更改为i