1. 問題描述:
人們會互相傳送好友請求,現在給定乙個包含有他們年齡的陣列,ages[i] 表示第 i 個人的年齡。
當滿足以下任一條件時,a 不能給 b(a、b不為同一人)傳送好友請求:
age[b] <= 0.5 * age[a] + 7
age[b] > age[a]
age[b] > 100 && age[a] < 100
否則,a 可以給 b 傳送好友請求。注意如果 a 向 b 發出了請求,不等於 b 也一定會向 a 發出請求。而且,人們不會給自己傳送好友請求。 求總共會發出多少份好友請求?
示例 1:
輸入:[16,16]
輸出:2
解釋:二人可以互發好友申請。
示例 2:
輸入:[16,17,18]
輸出:2
解釋:好友請求可產生於 17 -> 16, 18 -> 17.
示例 3:
輸入:[20,30,100,110,120]
輸出:3
解釋:好友請求可產生於 110 -> 100, 120 -> 110, 120 -> 100.
2. 思路分析:
① 第乙個比較容易想到的是暴力破解,但是提交上去超時了,第二個想到的方法是對陣列中對應年齡進行計數,可以使用python中的字典進行計數,統計出當前年齡的人數,使用乙個迴圈累加當前年齡的總人數方便後面計算傳送好友請求的人數,然後遍歷0-121這個年齡段能夠傳送的請求,公式如下:
j = i // 2 + 7
res += (dic[i] - dic[j] - 1) * (dic[i] - dic[i - 1])
j表示在0-i這個範圍之內是否存在年齡使得i > j,dic[i] - dic[j]表示在i這個年齡段能夠傳送的好友請求(減去不符合題目的人數),-1表示自己不能夠給自己傳送請求,(dic[i] - dic[i - 1])表示當前年齡i的人數,我們只需要將結果相乘起來即可
3. **如下:
import collections
from typing import list
class solution:
def numfriendrequests(self, ages: list[int]) -> int:
# 先統計1-120這個年齡段的人數是多少
# collections.defaultdict(int)會初始化字典的值為0
dic = collections.defaultdict(int)
for i in ages:
dic[i] += 1
# 累加到當前年齡段的人數
for i in range(1, 121):
dic[i] += dic[i - 1]
res = 0
for i in range(121):
j = i // 2 + 7
if j >= i: continue
res += (dic[i] - dic[j] - 1) * (dic[i] - dic[i - 1])
return res
LeetCode 825 適齡的朋友
看完條件一晃眼.好像叫德摩根定律?似乎是離散數學裡的 反正展開就對了 為了表達方便修改了運算子 b 0.5 a 7 b a b 100 a 100 b 0.5 a 7 b a b 100 a 100 b 0.5 a 7 b a b 100 a 100 b 0.5 a 7 b a故 b 14,a b,...
男的朋友 男朋友 老公
男的朋友 他會說好多好多好聽的話哄你開心,就算你再怎麼生氣發脾氣他都是笑嘻嘻的,他會想方設法討好你,因為他在追求你。男朋友 他只會對你說一些有用的話,關心你的話,更多的是談論你的生活 健康 學習 工作等方面的事,因為他從心裡關心你。老公 他會閒你話多,他不會說好聽的甜言蜜語給你聽,甚至只會指揮你做這...
女的朋友VS女朋友
女的朋友 去餐廳的時候,她會說,這次我請客,然後瀟灑地付賬。女朋友 去餐廳的時候,她什麼也不說,便拿起賬單來看,因為你的錢都在她兜裡。女的朋友 你們出去玩的時候,她會說 去主題公園吧,我最喜歡那裡了!女朋友 你們出去玩的時候,她會說 去主題公園吧,你最喜歡那裡了!女的朋友 新年前你們逛商店的時候,她...