"""
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)
最後輸出的結果分別如下: