【发布时间】:2016-08-11 03:07:53
【问题描述】:
重复数组[4,4,1]。在 O(n) 中找到 sum 5 的对。
预期输出(4,1) 和(4,1),计数为2。
方法#1:
使用HashSet:
public static int twoSum(int[] numbers, int target) {
HashSet<Integer> set = new HashSet<Integer>();
int c = 0;
for(int i:numbers){
if(set.contains(target-i)){
System.out.println(i+"-"+(target-i));
c++;
}
set.add(i);
}
return c;
}
输出是1。
link 中所述的方法 #2:
private static final int MAX = 100000;
static int printpairs(int arr[],int sum)
{
int count = 0;
boolean[] binmap = new boolean[MAX];
for (int i=0; i<arr.length; ++i)
{
int temp = sum-arr[i];
if (temp>=0 && binmap[temp])
{
count ++;
}
binmap[arr[i]] = true;
}
return count;
}
输出1。
但是O(nlog n) 解决方案使用的是对数组进行排序:
public static int findPairs(int [] a, int sum){
Arrays.sort(a);
int l = 0;
int r = a.length -1;
int count = 0;
while(l<r){
if((a[l] + a[r]) == sum){
count ++;
System.out.println(a[l] + " "+ a[r]);
r--;
}
else if((a[l] + a[r])>sum ){
r--;
}else{
l++;
}
}
return count;
}
我们可以在O(n) 中获得解决方案吗?
【问题讨论】:
-
在方法 #2 中是什么阻止您将
boolean[]更改为int[]? -
@user3707125 将
boolean[]更改为int[]有何不同? -
方法#3 是有效的。只需在 O(n) 时间内使用数组排序,而不是在 O(nlg(n) 时间使用数组排序,这当然假设您可以在输入上使用基数或计数排序(使用给定的整数范围,您可以) .
-
我认为方法 #1 需要在 for 循环之前填充 HashSet 才能工作。