/** * 超时 * * @param time * @return */ public int numPairsDivisibleBy60(int[] time) { int result = 0; for (int i = 0; i < time.length - 1; i++) { for (int j = i + 1; j < time.length; j++) { int value = (time[i] + time[j]) % 60; if (value == 0) result++; } } return result; }
public int numPairsDivisibleBy601(int[] time) { // 每个元素取60余 time = Arrays.stream(time).map(x -> x % 60).toArray(); int[] arrCount = new int[60]; // 统计对应下标数 Arrays.stream(time).forEach(x -> { arrCount[x]++; }); // 余数是 0 或 30 的两两配对 int result = qiuhe(arrCount[0]) + qiuhe(arrCount[30]); // 其余互相配对 for (int i = 1; i < 30; i++) { int count1 = arrCount[i]; int count2 = arrCount[60 - i]; result += count1 * count2; } return result; }
/** * 求两两配对数 * * @param num * @return */ private int qiuhe(int num) { if (num < 2) return 0; // (num-1)! return num * (num - 1) / 2; }
很好理解,不过速度还是慢,通过阅读其它人的代码后发现了另一种 O(n) 解法,cool~
1 2 3 4 5 6 7 8 9 10 11 12 13
public int numPairsDivisibleBy602(int[] time) { int result = 0; int[] arrCount = new int[60]; for (int t : time) { // 对应的下标 int index = t == 0 ? 0 : 60 - t % 60; // 与已经统计的数进行匹配 可防止两两重复匹配 result += arrCount[index]; // 对应数字加一 arrCount[t % 60]++; } return result; }