Java 在数组中查找O(n)中有重复项的和对
具有重复项的数组Java 在数组中查找O(n)中有重复项的和对,java,arrays,algorithm,Java,Arrays,Algorithm,具有重复项的数组[4,4,1]。在O(n)中查找sum5的对。 预期输出(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(tar
[4,4,1]
。在O(n)
中查找sum5
的对。
预期输出(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
但是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;
}
公共静态int findPairs(int[]a,int sum){
数组。排序(a);
int l=0;
int r=a.长度-1;
整数计数=0;
while(lsum){
r--;
}否则{
l++;
}
}
返回计数;
}
我们可以在
O(n)
中得到解决方案吗?您可以使用第二种方法-只需将boolean
更改为int
:
public static void main(String[] args) {
System.out.println(printPairs(new int[]{3, 3, 3, 3}, 6)); // 6
System.out.println(printPairs(new int[]{4, 4, 1}, 5)); // 2
System.out.println(printPairs(new int[]{1, 2, 3, 4, 5, 6}, 7)); // 3
System.out.println(printPairs(new int[]{3, 3, 3, 3, 1, 1, 5, 5}, 6)); // 10
}
public static int printPairs(int arr[], int sum) {
int count = 0;
int[] quantity = new int[sum];
for (int i = 0; i < arr.length; ++i) {
int supplement = sum - arr[i];
if (supplement >= 0) {
count += quantity[supplement];
}
quantity[arr[i]]++; // You may need to check that arr[i] is in bounds
}
return count;
}
publicstaticvoidmain(字符串[]args){
System.out.println(printPairs(新的int[]{3,3,3,3},6));//6
System.out.println(printPairs(新的int[]{4,4,1},5));//2
println(printPairs(新的int[]{1,2,3,4,5,6},7));//3
println(printPairs(新的int[]{3,3,3,1,1,5,5},6));//10
}
公共静态int打印对(int arr[],int sum){
整数计数=0;
整数[]数量=新整数[总和];
对于(int i=0;i=0){
计数+=数量[补充];
}
数量[arr[i]]++;//您可能需要检查arr[i]是否在边界内
}
返回计数;
}
是什么阻止你在方法#2中将boolean[]
更改为int[]
呢?@user3707125将boolean[]
更改为int[]
会有什么不同?方法#3有效地存在。只需在O(n)时间内使用数组排序,而不是在O(nlg(n)时间内使用数组排序,这当然是假设您可以在输入上使用诸如基数或计数排序之类的东西(您可以使用给定的整数范围)。我认为方法#1需要在for循环之前填充哈希集才能工作。
public static void main(String[] args) {
System.out.println(printPairs(new int[]{3, 3, 3, 3}, 6)); // 6
System.out.println(printPairs(new int[]{4, 4, 1}, 5)); // 2
System.out.println(printPairs(new int[]{1, 2, 3, 4, 5, 6}, 7)); // 3
System.out.println(printPairs(new int[]{3, 3, 3, 3, 1, 1, 5, 5}, 6)); // 10
}
public static int printPairs(int arr[], int sum) {
int count = 0;
int[] quantity = new int[sum];
for (int i = 0; i < arr.length; ++i) {
int supplement = sum - arr[i];
if (supplement >= 0) {
count += quantity[supplement];
}
quantity[arr[i]]++; // You may need to check that arr[i] is in bounds
}
return count;
}