力扣第 189 场周赛(提供思路和代码)

这次做出前两道题,其他是赛后参考大神们的写法。

一、在既定时间做作业的学生人数

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)

三、收藏清单

1、题目描述:
https://leetcode-cn.com/contest/weekly-contest-189/problems/people-whose-list-of-favorite-companies-is-not-a-subset-of-another-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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值