LeetCode | 2023.03.31 |2367. 算術三元組的數目

"""
2367. 算術三元組的數目
https://leetcode.cn/problems/number-of-arithmetic-triplets/
題目分析:
    這題難度是簡單,求解的是判斷一個列表有多少等差數列,其中差值diff是指定的.
    有兩種方法可以做這題:
    1.簡單的循環,然後判斷;python有函數set,可以用in快速判斷
    2.還有一種方法是集合運算,取集合的交集,最後返回剩餘值就可以
理論1: 循環
    將nums轉成setNum,然後從頭開始循環列表;
    生成num1=cur+diff,num2=cur+diffx2;
    如果num1和num2都存在setNums中,cnt+1
理論2: 集合
        set0:    4   5   6   7   8   9
        set1:    6   7   8   9  10  11
        set2:    8   9  10  11  12  13
    通過上面這個例子,可以看到只有8和9在並集中出現,
    因爲數列是從小到大有序,也表示共有兩組元組滿足條件
        set0:    4   5   6   7   8   9
        set1:            6   7   8   9  10   11
        set2                     8   9  10   11   12   13
   set0&set1&set2                8   9
注意/難點:
    na
"""
class Solution:
    def arithmeticTriplets_loop(self, nums:list, diff: int) -> int:
        cnt=0                                           #初始化結果
        setNums=set(nums)                               #轉成集合去重
        for i in range(len(nums)):
            num1=nums[i]+diff                           #生成兩個等差值
            num2=nums[i]+diff*2
            if num1 in setNums and num2 in setNums:     #判斷是否存在
                cnt+=1                                  #結果+1
                print(nums[i],num1,num2)    #debug
        return cnt                                      #返回結果

    def arithmeticTriplets_set(self, nums:list, diff: int) -> int:
        set0=set(nums)                                #轉成集合
        set1=set([x+diff for x in nums])              #生成+diff集合
        set2=set([x+diff*2 for x in nums])            #生成+diffx2集合
        ret=set0&set1&set2                            #獲取並集
        return len(ret)

# nums = [0,1,4,6,7,10]
# diff = 3
nums = [4,5,6,7,8,9]
diff = 2
# ans=Solution().arithmeticTriplets_loop(nums,diff)
ans=Solution().arithmeticTriplets_set(nums,diff)
print(ans)

最後輸出的結果分別如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章