【算法训练】LeetCode#1512 好数对的数目

一、描述

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

二、思路

首先想到的肯定是时间复杂度为logn的做法,从头向后遍历。

其实可以利用map,通过一次遍历即可。

三、解题

Java

class Solution {
    public static int numIdenticalPairs(int[] nums) {

        HashMap<Integer, List<Integer>> map = new HashMap<>();
        for (int num : nums) {
            List<Integer> cur = Arrays.asList(0, 0);
            if (map.containsKey(num)){
                // 存在
                cur = map.get(num);
                cur.set(0, cur.get(0) + 1);
                cur.set(1, cur.get(1) + cur.get(0));
            }
            map.put(num,cur);
        }
        int ans = 0;
        for (Map.Entry<Integer, List<Integer>> entity : map.entrySet()){
            ans += entity.getValue().get(1);
        }
        return ans;
    }
}

C++

class Solution {
    public:
        int numIdenticalPairs(vector<int>& nums) {
            int ans = 0;
            unordered_map <int, int> map;
            for (int var : nums) {
                ++map[var];
            }
            for (auto kv :map){
                ans += kv.second * (kv.second - 1) / 2;
            }
            return ans;
        }

};
posted @ 2023-06-26 00:11  小拳头呀  阅读(14)  评论(0编辑  收藏  举报