Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.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_Python_Algorithm_Time Complexity - Fatal编程技术网

Java 对给定和的所有对进行有效计数

Java 对给定和的所有对进行有效计数,java,python,algorithm,time-complexity,Java,Python,Algorithm,Time Complexity,我遇到了以下问题 给定一个列表,其中每个项目表示歌曲的持续时间(以秒为单位),返回歌曲对的总数,使其持续时间总和为分钟,例如,1毫秒、2毫秒、 例如: 输入:[10,50,20110,40] 输出:在索引0,1,0,3,2,4处考虑3对 我只能想到一种蛮力的方法,我会考虑所有的歌曲。此方法的时间复杂度为^2。 有没有更好的办法 给定的问题可以归结为这样一个事实,即我们需要从给定的列表a中发现对a,b,这样a+b mod 60==0。 观察1:对于任何整数x,x mod 60位于o到59之间。 初

我遇到了以下问题

给定一个列表,其中每个项目表示歌曲的持续时间(以秒为单位),返回歌曲对的总数,使其持续时间总和为分钟,例如,1毫秒、2毫秒、

例如: 输入:[10,50,20110,40] 输出:在索引0,1,0,3,2,4处考虑3对

我只能想到一种蛮力的方法,我会考虑所有的歌曲。此方法的时间复杂度为^2。 有没有更好的办法

给定的问题可以归结为这样一个事实,即我们需要从给定的列表a中发现对a,b,这样a+b mod 60==0。 观察1:对于任何整数x,x mod 60位于o到59之间。 初始化一个长度为60的数组,默认值设置为0,该数组的索引i将存储列表A中的元素数,这样x mod 60=i表示属于A的所有x

int freq[60] = {0};
for(int i = 0; i < A.size(); i++)
  freq[(A[i] % 60)]++;

解决方案的总体复杂度取决于

想想散列、创建桶和模除法。所有可能的分钟都将进入60个可能的桶中的一个。然后想想,当你从任意两个桶中选择两个第二个值时,有多少种可能的组合。然后使用nC2进行计数。这是我的Java解决方案

public int numPairsDivisibleBy60(int[] time) {
    int k = 60;
    int[] mods = new int[k];
    for (int i = 0; i < time.length; i++) 
        mods[time[i] % k]++;
    // n(n-1)/2 pairs for multiples of k and numbers which leave remainder as half multiple of k
    int count = ((mods[0] * (mods[0] - 1)) / 2) +
                ((mods[k / 2] * (mods[k / 2] - 1)) / 2);
    for (int i = 1; i < k / 2; i++)
        count += mods[i] * mods[k - i];
    return count;
}

[30,20150100,40]失败。预期:3,实际:6;[60,60,60]失败。预期:3,实际:数组索引超出边界异常
public int numPairsDivisibleBy60(int[] time) {
    int k = 60;
    int[] mods = new int[k];
    for (int i = 0; i < time.length; i++) 
        mods[time[i] % k]++;
    // n(n-1)/2 pairs for multiples of k and numbers which leave remainder as half multiple of k
    int count = ((mods[0] * (mods[0] - 1)) / 2) +
                ((mods[k / 2] * (mods[k / 2] - 1)) / 2);
    for (int i = 1; i < k / 2; i++)
        count += mods[i] * mods[k - i];
    return count;
}