【算法通关】1512. 好数对的数目——组合计数

912 阅读2分钟

「这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战


玩算法的码农,打拼靠蓝条,像是法师。数学就等于蓝条最大值,数学差,魔法值不高,很快就到瓶颈了。外语影响回蓝速度。经验和智力加急速和穿透的。不玩算法的码农,像是战士,打拼靠血条,体质加生命,精神加生命回复,经验和敏捷加急速和破甲。

——leetcode此题热评

前言

大家好,我是一条,欢迎来到我的算法频道。

只做有趣的算法题,只为面试写算法

Question

1512. 好数对的数目

难度:简单

给你一个整数数组 nums 。

如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。

返回好数对的数目。

示例 1:

输入:nums = [1,2,3,1,1,3] 输出:4 解释:有 4 组好数对,分别是 (0,3), (0,4), (3,4), (2,5) ,下标从 0 开始 示例 2:

输入:nums = [1,1,1,1] 输出:6 解释:数组中的每组数字都是好数对 示例 3:

输入:nums = [1,2,3] 输出:0

提示:

1 <= nums.length <= 100 1 <= nums[i] <= 100

Solution

有点像上学时做的排列组合。

计数法,典型用用于计数排序:

通过计数将时间复杂度降到了O(N)

第一步:找出原数组中元素值最大的,记为max

第二步:创建一个新数组count,其长度是max加1,其元素默认值都为0。

第三步:遍历原数组中的元素,以原数组中的元素作为count数组的索引,以原数组中的元素出现次数作为count数组的元素值。

第四步:创建结果数组result,起始索引index

第五步:遍历count数组,找出其中元素值大于0的元素,将其对应的索引作为元素值填充到result数组中去,每处理一次,count中的该元素值减1,直到该元素值不大于0,依次处理count中剩下的元素。

第六步:返回结果数组result

Code

/**
 * @author 一条coding
 */
class Solution {
    public int numIdenticalPairs(int[] nums) {
        int ans=0;
        int[] counts = new int[101];
        // 计数 
        for (int num : nums) {
            counts[num]+=1;
        }
        // 求和
        for (int c : counts) {
            ans+=c*(c-1)/2;
        }
        return ans;
    }
}

最后

点赞,点赞,还TMD是点赞!