LeetCode 第 23 场双周赛

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-largest-group

1、给你一个整数 n 。请你先求出从 1 到 n 的每个整数 10 进制表示下的数位和(每一位上的数字相加),然后把数位和相等的数字放到同一个组中。
请你统计每个组中的数字数目,并返回数字数目并列最多的组有多少个。

示例 1:
输入:n = 13
输出:4
解释:总共有 9 个组,将 1 到 13 按数位求和后这些组分别是:
[1,10],[2,11],[3,12],[4,13],[5],[6],[7],[8],[9]。总共有 4 个组拥有的数字并列最多。

题意指的是找到拥有最多数目的组,并看拥有相同数目的组的个数

didt.keys(),dict.values(),dict.items(),dict.setdefalut(key,default=None),enumerate(list)
[ f(x) for x in list (if x) ]

class Solution:
    def countLargestGroup(self, n: int) -> int:
        res = {}
        for i in range(1,n+1):
            tmp = sum([int(x) for x in str(i)])
            res.setdefault(tmp, 0)
            res[tmp] += 1
        l = res.values()
        ans = max(l)
        count = sum(1 for value in l if value == ans)
        return count

2、给你一个字符串 s 和一个整数 k 。请你用 s 字符串中 所有字符 构造 k 个非空 回文串 。
如果你可以用 s 中所有字符构造 k 个回文字符串,那么请你返回 True ,否则返回 False 。

示例 1:
输入:s = “annabelle”, k = 2
输出:true
解释:可以用 s 中所有字符构造 2 个回文字符串。
一些可行的构造方案包括:“anna” + “elble”,“anbna” + “elle”,“anellena” + “b”

关键查看奇数个数字符串的大小与k的比较
class Solution:
    def canConstruct(self, s: str, k: int) -> bool:
        if k > len(s):return False
        res = {}
        for i in s:
            res.setdefault(i,0)
            res[i] += 1
        count = sum(1 for value in res.values() if value % 2 == 1)

        if count <= k:
            return True
        else:
            return False

3、给你一个以 (radius, x_center, y_center) 表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2),其中 (x1, y1) 是矩形左下角的坐标,(x2, y2) 是右上角的坐标。
如果圆和矩形有重叠的部分,请你返回 True ,否则返回 False 。换句话说,请你检测是否 存在 点 (xi, yi) ,它既在圆上也在矩形上(两者都包括点落在边界上的情况)。

LeetCode 第 23 场双周赛_第1张图片
输入:radius = 1, x_center = 0, y_center = 0, x1 = 1, y1 = -1, x2 = 3, y2 = 1
输出:true
解释:圆和矩形有公共点 (1,0)

划分为几个区域讨论

LeetCode 第 23 场双周赛_第2张图片

class Solution:
    def checkOverlap(self, radius: int, x_center: int, y_center: int, x1: int, y1: int, x2: int, y2: int) -> bool:
        # 四角
        for x in (x1, x2):
            for y in (y1, y2):
                if ((x_center - x)**2 + ( y_center - y)**2)**0.5 <= radius:
                    return True
        # 内部和左右上下
        if x1 <= x_center <= x2 and y1 - radius  <= y_center <= y2 + radius:
            return True
        if x1 - radius <= x_center <= x2 + radius and y1  <= y_center <= y2:
            return True
        return False

4、一个厨师收集了他 n 道菜的满意程度 satisfaction ,这个厨师做出每道菜的时间都是 1 单位时间。一道菜的 「喜爱时间」系数定义为烹饪这道菜以及之前每道菜所花费的时间乘以这道菜的满意程度,也就是 time[i]*satisfaction[i] 。

请你返回做完所有菜 「喜爱时间」总和的最大值为多少。可以按任意顺序安排做菜的顺序,你也可以选择放弃做某些菜来获得更大的总和。

示例 1:
输入:satisfaction = [-1,-8,0,5,-9]
输出:14
解释:去掉第二道和最后一道菜,最大的喜爱时间系数和为 (-11 + 02 + 5*3 = 14) 。每道菜都需要花费 1 单位时间完成。

class Solution:
    def maxSatisfaction(self, satisfaction: List[int]) -> int:
        # -3 -2 -1 0 3 5
        res = sorted(satisfaction)
        k = len([x for x in res if x < 0])

        def f(l):
            sum = 0
            for i,element in enumerate(l):
                sum += (i + 1) * element
            return sum
        
        if k < len(res):
            ans = f(res[k:])
        else:
            ans = 0

        for i in range(k):
            tmp = f(res[i:])
            if tmp > ans:
                ans = tmp

        return ans

LeetCode 第 23 场双周赛_第3张图片
LeetCode 第 23 场双周赛_第4张图片

class Solution:
    def maxSatisfaction(self, satisfaction: List[int]) -> int:
        satisfaction.sort(reverse=True)
        presum, ans = 0, 0
        for si in satisfaction:
            if presum + si > 0:
                presum += si
                ans += presum
            else:
                break
        return ans


你可能感兴趣的:(leetcode)