LeetCode周赛-202(Python)

5489. 两球之间的磁力
LeetCode周赛-202(Python)_第1张图片

最大值最小或最小值最大——二分
以二分的中间值,作为间距去摆放球。如果摆放的球数 >=m, 可认为需要增加球间距 (同时保存中间值作为候选答案); 否则需要减少球间距。
两球的最小距离的最小值,是1;最小距离的最大值是 (最后位置的球坐标 - 最前位置的球坐标) / (球数-1),这里需要先对position数组排序,那么易得最小球间距离的最大值为 (position[position.length - 1] - position[0]) / (m-1)
参考题解区大佬

注意二分查找细节

class Solution:
    def maxDistance(self, position: List[int], m: int) -> int:
        position.sort()
               
        l, r = 0, position[-1]
        while l <= r:
            mid = l + (r-l)//2           
            cnt=1
            last = position[0]
            for i in range(1,len(position)):
                if position[i]-last>=mid:
                    cnt += 1
                    last = position[i]                                
            if cnt>=m:
                l = mid+1
            else:
                r = mid-1
        return r

5490. 吃掉 N 个橘子的最少天数
LeetCode周赛-202(Python)_第2张图片
提示:1 <= n <= 2*10^9

抽象为求0-n的最短路径,BFS
dp的话,需要从0循环到n,会超时

class Solution:
    def minDays(self, n: int) -> int:
        if n==0 or n==1:
            return 1
        if n==2 or n==3:
            return 2
        queue = []
        queue.append([n,1])
        visited = set()

        while queue:
            m,step = queue.pop(0)
            if m in visited:
                continue
            
            if m==1: return step
            step += 1
            queue.append([m-1,step])
            if m%2==0:
                queue.append([m//2,step])
            if m%3==0:
                queue.append([m//3,step])
            visited.add(m)
 
        return -1

unordered_map底层是哈希表,增删时间复杂度是O(1)

相关题目
Acwing 100. 增减序列
TODO
410. 分割数组的最大值
https://leetcode-cn.com/problems/split-array-largest-sum/solution/er-fen-cha-zhao-by-liweiwei1419-4/
TODO

你可能感兴趣的:(LeetCode,leetcode,python)