【Lintcode】572. Music Pairs

题目地址:

https://www.lintcode.com/problem/music-pairs/description

给定一个数组 A A A,问能找到多少组二元组使得两数之和是 60 60 60的倍数。顺序不同算同一个组。题目保证 A A A只含 1 ∼ 60 1\sim 60 160的数。

先求一下每个数出现的次数,设 c [ i ] c[i] c[i] i i i出现次数,那么对于 k + ( 60 − k ) k+(60-k) k+(60k)这样的数对,有 c [ k ] c [ 60 − k ] c[k]c[60-k] c[k]c[60k]个组合,而对于 30 + 30 30+30 30+30 60 + 60 60+60 60+60的组合,各有 c [ 30 ] ( c [ 30 ] − 1 ) c[30](c[30]-1) c[30](c[30]1) c [ 60 ] ( c [ 60 ] − 1 ) c[60](c[60]-1) c[60](c[60]1)个。求个总和即可。代码如下:

public class Solution {
    /**
     * @param musics: the musics
     * @return: calc the number of pair of music
     */
    public long musicPairs(int[] musics) {
        // write your code here
        long[] count = new long[61];
        for (int music : musics) {
            count[music]++;
        }
        
        long res = 0;
        for (int i = 1; i < 30; i++) {
            res += count[i] * count[60 - i];
        }
        
        for (int i = 30; i <= 60; i += 30) {
            if (count[i] >= 2) {
                res += count[i] * (count[i] - 1) / 2;
            }
        }
        
        return res;
    }
}

时间复杂度 O ( l A ) O(l_A) O(lA),空间 O ( 1 ) O(1) O(1)

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页