Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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 在具有大值的排序数组中查找对_Java_Arrays - Fatal编程技术网

Java 在具有大值的排序数组中查找对

Java 在具有大值的排序数组中查找对,java,arrays,Java,Arrays,我目前遇到了一个问题,就是在排序数组中查找具有大值的对。示例:如果我将数组sortedar=[1,2,2,2,2,2,3]作为输入。它应该返回pairs=15 我已经编写了下面的代码,它在O(N2)中适用于未排序数组和排序数组。但是代码非常基本,我希望它能够更快地管理排序数组。我想最简单的方法就是将当前元素与它旁边的元素进行比较。但我不知道我怎么能做到。如何更改代码以满足我的要求 public static int countpairs(int[] sortedarr) {

我目前遇到了一个问题,就是在排序数组中查找具有大值的对。示例:如果我将数组sortedar=[1,2,2,2,2,2,3]作为输入。它应该返回pairs=15

我已经编写了下面的代码,它在O(N2)中适用于未排序数组和排序数组。但是代码非常基本,我希望它能够更快地管理排序数组。我想最简单的方法就是将当前元素与它旁边的元素进行比较。但我不知道我怎么能做到。如何更改代码以满足我的要求

    public static int countpairs(int[] sortedarr) {
        int N = sortedarr.length;
        int pairs = 0;

        for (int i = 0; i < N; i++) {
            for (int j = i + 1; j < N; j++) {
                if (sortedarr[i] == sortedarr[j]) {
                    pairs++;
                }
            }
        }
        return pairs;
    }
}
公共静态int计数对(int[]分类器){
int N=分拣机长度;
整数对=0;
对于(int i=0;i
这里有一种方法可以用O(N)而不是O(N^2)来实现:

publicstaticvoidmain(字符串[]args){
int[]a=新的int[]{1,2,2,2,2,2,3};
int i=0;
int n=a.长度;
int ans=0;
而(i1){
ans=ans+(dupeCount*(dupeCount-1)/2);
}
i++;
}
系统输出打印LN(ans);
}
产出15


这个想法与Bubble sort使用的有点类似。我们只需要查看数组中的每个项及其后续项,看看它是否重复。从这里开始,可以创建的不同对的数量就是
C(dupeCount,2)=dupeCount*(dupeCount-1)/2
。我们将所有这些事件相加,得到最终的答案。

这里有一种方法可以用O(N)代替O(N^2):

publicstaticvoidmain(字符串[]args){
int[]a=新的int[]{1,2,2,2,2,2,3};
int i=0;
int n=a.长度;
int ans=0;
而(i1){
ans=ans+(dupeCount*(dupeCount-1)/2);
}
i++;
}
系统输出打印LN(ans);
}
产出15


这个想法与Bubble sort使用的有点类似。我们只需要查看数组中的每个项及其后续项,看看它是否重复。从这里开始,可以创建的不同对的数量就是
C(dupeCount,2)=dupeCount*(dupeCount-1)/2
。我们将所有这些事件相加,得到最终答案。

那么您想要从数组中的重复元素生成的不同对的数量?它是如何在O(N)中运行的?是的,这是正确的!:)@jrookI写错了,我编辑了@KousikMandalIn的帖子,在这种情况下,你只需要计算重复元素的数量,然后计算C(p1,2)+C(p2,2)+。如果数组中有六个2和四个5,结果是C(6,2)+C(4,2)=15+6=21。这是正确的吗?那么您想要从数组中的重复元素生成的不同对的数量?它是如何在O(N)中运行的?是的,这是正确的!:)@jrookI写错了,我编辑了@KousikMandalIn的帖子,在这种情况下,你只需要计算重复元素的数量,然后计算C(p1,2)+C(p2,2)+。如果数组中有六个2和四个5,结果是C(6,2)+C(4,2)=15+6=21。这是正确的吗?我认为这是最快的解决方案,您必须迭代数组,并且执行一次是最快的方法。对于特殊情况,可能会有一些优化(例如,如果您知道分布或可能性),但是这个解决方案肯定在
O(n)
中,其他的也一样。很高兴它有帮助。如果这对你有帮助,请接受答案。干杯@Jacki222我认为这是最快的解决方案,你必须遍历数组,一次遍历是最快的方法。对于特殊情况,可能会有一些优化(例如,如果您知道分布或可能性),但是这个解决方案肯定在
O(n)
中,其他的也一样。很高兴它有帮助。如果这对你有帮助,请接受答案。干杯@Jacki222
public static void main(String[] args) {
    int[] a= new int[] {1, 2, 2, 2, 2, 2, 2, 3};
    int i = 0;
    int n = a.length;
    int ans = 0;
    while(i < n - 1) {
        int dupeCount = 1;
        while(i < n - 1 && a[i] == a[i + 1]) {
            dupeCount++;
            i++;
        }
        if(dupeCount > 1) {
            ans = ans + (dupeCount * (dupeCount-1) / 2);
        }
        i++;
    }
    System.out.println(ans);
}