Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在数组中查找O(n)中有重复项的和对_Java_Arrays_Algorithm - Fatal编程技术网

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)
中查找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

但是
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;
}