这次做出前两道题,其他是赛后参考大神们的写法。
一、在既定时间做作业的学生人数
1、题目描述:
https://leetcode-cn.com/contest/weekly-contest-189/problems/number-of-students-doing-homework-at-a-given-time/
2、题解:
一次遍历,设置count初值位0,如果查询时间在作业时间之间,就让count +1,返回count即可。
class Solution:
def busyStudent(self, startTime: List[int], endTime: List[int], queryTime: int) -> int:
count = 0
for i in range(len(startTime)):
if startTime[i] <= queryTime <= endTime[i]:
count += 1
return count
二、重新排列句子中的单词
1、题目描述:
2、题解:
class Solution:
def arrangeWords(self, text: str) -> str:
text_list = text.split()
# print(text_list)
lens = len(text_list)
# print(lens)
res = []
if text_list[0]:
text_list[0] = text_list[0].lower()
text_list.sort(key = lambda i:len(i))
# print(text_list)
if text_list[0]:
text_list[0] = text_list[0].capitalize()
return ' '.join(text_list)
三、收藏清单
2、题解:
class Solution:
def peopleIndexes(self, favoriteCompanies: List[List[str]]) -> List[int]:
res = []
for p, companies in enumerate(favoriteCompanies):
if all(not set(companies).issubset(set(c)) for c in favoriteCompanies if c != companies):
res.append(p)
return res
class Solution:
def peopleIndexes(self, favoriteCompanies: List[List[str]]) -> List[int]:
favorite = sorted(enumerate(map(set, favoriteCompanies)), key=lambda x: len(x[1]), reverse=True)
ans = []
for i in range(len(favorite)):
flag = True
for j in range(i):
if favorite[i][1] <= favorite[j][1]:
flag = False
break
if flag:
ans.append(favorite[i][0])
return sorted(ans)
四、圆形靶内的最大飞镖数量
1、题目描述:
https://leetcode-cn.com/contest/weekly-contest-189/problems/maximum-number-of-darts-inside-of-a-circular-dartboard/
2、题解:
枚举圆心
class Solution:
def numPoints(self, points: List[List[int]], r: int) -> int:
def dist2(p1: List[int], p2: List[int]) -> int:#计算距离
return (p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2
def getCircle(p1: List[int], p2: List[int]) -> List[float]:#计算圆心
mid = [(p1[0] + p2[0]) / 2, (p1[1] + p2[1]) / 2]
angle = math.atan((p1[0] - p2[0]) / (p2[1] - p1[1])) if p2[1] - p1[1] else math.pi / 2
d = math.sqrt(r2 - dist2(p1, mid))
return [mid[0] + d * math.cos(angle), mid[1] + d * math.sin(angle)]
n = len(points)
ans = 1
eps = 1e-6
r2 = r * r
for i in range(n):
for j in range(i + 1):
if dist2(points[i], points[j]) > 4 * r2:
continue
center = getCircle(points[i], points[j])
count = 0
for k in range(n):
if dist2(points[k], center) < r2 + eps:
count += 1
ans = max(ans, count)
return ans