Java 数组中的偶和
我有一个整数数组,上面写着:Java 数组中的偶和,java,algorithm,Java,Algorithm,我有一个整数数组,上面写着:[17,1,20,4,12,9]我想得到所有和为21的夫妇。 例如,在给定的数组中,输出应如下所示: 17,4 1,20 12,9 我可以使用两个循环来实现同样的效果。但复杂性是N^2。有什么有效的方法可以做到这一点。使用哈希集 例如,将所有元素放在一个哈希集中(单循环,O(N)) 然后再次迭代元素,对于每个元素i,检查HashSet是否包含21-i。这也需要O(N) 您可以在单个循环中进一步优化和执行这两个步骤,但这不会改变渐近O(N)运行时间 Set<In
[17,1,20,4,12,9]
我想得到所有和为21的夫妇。
例如,在给定的数组中,输出应如下所示:
17,4
1,20
12,9
我可以使用两个循环来实现同样的效果。但复杂性是N^2。有什么有效的方法可以做到这一点。使用
哈希集
例如,将所有元素放在一个哈希集中(单循环,O(N))
然后再次迭代元素,对于每个元素i
,检查HashSet
是否包含21-i
。这也需要O(N)
您可以在单个循环中进一步优化和执行这两个步骤,但这不会改变渐近O(N)运行时间
Set<Integer> set = new HashSet<>();
for (int i=0;i<arr.length;i++) {
if (set.contains(21 - arr[i])) {
System.out.println(arr[i] + ", " + (21 - arr[i]));
}
set.add (arr[i]);
}
Set Set=newhashset();
对于(int i=0;i,这里有一段工作代码和您的示例,使用HashSet
:
import java.util.*;
public class Main{
public static void main(String[] args) {
int[] arr = new int[]{17, 1, 20, 4, 12, 9};
HashSet<Integer> hash = new HashSet<Integer>();
int sum = 21;
for(int i = 0; i < arr.length; i++){
hash.add(arr[i]);
}
for(int i = 0; i < arr.length; i++){
if(hash.contains(sum - arr[i])){
System.out.println(arr[i] + " and " + (sum - arr[i]));
hash.remove(arr[i]);
}
}
}
}
import java.util.*;
公共班机{
公共静态void main(字符串[]args){
int[]arr=新的int[]{17,1,20,4,12,9};
HashSet hash=新HashSet();
整数和=21;
对于(int i=0;i
复杂度为O(n)。方法是将数组的所有数字添加到哈希集中。然后,迭代数组,检查每个元素arr[i]
,sum-arr[i]
位于哈希集中。如果是,则表示您有一个匹配对,因此您可以删除该对中的一个元素以避免重复匹配。下面是一个使用python 3.0+的解决方案。
您可以在O(N)中使用密钥对值数据结构(即字典)来完成此操作
方法:
在数组中循环一次,检查从当前元素即(k-arr[i])中减去的值k的结果是否存在于字典中,这意味着结果值k-arr[i]和当前元素arr[i]的总和等于k。将这两个值相加到字典中
如果字典中不存在k-arr[i],则添加值为k-arr[i]的键arr[i]
您还可以添加当前元素arr[i]大于k的检查
def getPair(arr, k, dict):
for i in range(len(arr)):
if k - arr[i] in dict.keys():
pass
#print(arr[i], " ", (k-arr[i]))
else:
if k > arr[i]:
dict[arr[i]] = (k-arr[i])
arr = [17, 1, 20, 4, 12, 9, 23]
dict = {}
getPair(arr, 21, dict)
print("result: " , dict)
您可以使用哈希集在O(n)或使用集合在O(n lg(n))中执行此操作。您能给出一点逻辑吗?此问题的一般化版本已在为您的案例添加工作解决方案时得到回答。但是哈希集包含方法本身,每种方法都具有O(n)复杂度element@Shadow否,HashSet
的contains()
预期为O(1)复杂性。不,它是O(1)。谢谢你的回答,但这会打印两次数字,对吗?@Shadow No。当你遇到一对中的第一个数字时,第二个数字还不在集合中,所以直到你遇到第二个数字时,这对数字才被打印出来。