今日のLeetCode(8/20)

設問

「Number of Good Pairs」 [1,2,3,1,1,3]みたいな配列numについて nums[i] == nums[j]'かつi < j'となるペアの数を出す

私の書いたコード

import copy
class Solution:
    def numIdenticalPairs(self, nums: List[int]) -> int:
        res = 0
        for i,j in enumerate(nums):
            copy_nums = copy.copy(nums)
            del copy_nums[0:i+1]
            res += copy_nums.count(j)
        return res

i < jなので、iよりindexが若いものを消したListを作ってcountしていく。

最初はcopy_nums = numsと書いていたが、ちゃんとコピーしないともとのnumsからも消されていってしまう…。

ほかのコードを見て

あれ、なんかみんな結構分量書いてる…?

class Solution:
    def numIdenticalPairs(self, nums):
        goodPairs = 0
        for i, value in enumerate(nums):
            for j, value2 in enumerate(nums):
                if i < j and value == value2:
                    goodPairs += 1
                    print(goodPairs, i, value)
        return goodPairs

上は単純にnum[i]'とnum[j]'をそれぞれ取ってきて比較しているみたい

ループ回数多いけど忠実な気はする。

class Solution:
    def numIdenticalPairs(self, nums: List[int]) -> int:
        usedNums = {}
        num = 0
        for i in nums:
            if i in usedNums:
                if usedNums[i] == 1:
                    num +=1
                else:
                    num += usedNums[i]
                usedNums[i] +=1
            else:
                usedNums[i] = 1
        return num

listの頭から順にdicに入れていき、同じ番号が入ってきたらdic側をカウントアップして、過去に出てきた回数分numに足していくのね…なるほど…。