Java 对给定和的所有对进行有效计数
我遇到了以下问题 给定一个列表,其中每个项目表示歌曲的持续时间(以秒为单位),返回歌曲对的总数,使其持续时间总和为分钟,例如,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的所有xJava 对给定和的所有对进行有效计数,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之间。 初
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;
}