Leetcode 周赛 214 题解

https://leetcode-cn.com/contest/weekly-contest-214/
竞赛地址

5561. 获取生成数组中的最大值

没啥好说的,直接模拟就好了

class Solution:
    def getMaximumGenerated(self, n: int) -> int:
        if not n:
            return 0
        nums=[0,1]
        for i in range(2,n+1):
            if i&1:
                nums.append(nums[i//2] +nums[i//2+1])
            else:
                nums.append(nums[i//2])
        print(nums)
        return max(nums)

5562. 字符频次唯一的最小删除次数

先一遍遍历整个字符串,获取每种字符出现频次,然后使用哈希表去重即可(最后循环看起来是while但是实际上最多执行26+25…+1次,比起遍历字符串可以忽略不计,当然也有其他去重方法)

class Solution:
    def minDeletions(self, s: str) -> int:
        cnt = [0 for _ in range(26)]
        for ch in s:
            cnt [ ord(ch) - ord('a')] +=1
        ans = 0 
        visited = set()
        for i in range(26):
            while cnt[i] and cnt[i] in visited:
                cnt[i] -= 1
                ans += 1
            visited.add(cnt[i])
        print(cnt)
        return ans

5563. 销售价值减少的颜色球

贪心算法,永远优先卖最贵的。
具体就是先从大到小排序,然后按阶梯来卖球。
Leetcode 周赛 214 题解_第1张图片

class Solution:
    def maxProfit(self, inventory: List[int], orders: int) -> int:
        inventory.sort(reverse=True)
        inventory.append(0)
        price = 0
        for i in range(1,len(inventory)):
            if orders >= i*(inventory[i-1]-inventory[i]):
            #如同上图的红色、黄色方框里的情形
                price += i*(inventory[i-1]-inventory[i])*(inventory[i]+inventory[i-1]+1)//2
                orders -= i*(inventory[i-1]-inventory[i])
            else:
                price += (i)*(orders//i)*(inventory[i-1]*2-orders//i+1)//2
                #上图黑色方框的情形
                print(price,orders,i)
                price += (orders%i)*(inventory[i-1]-orders//i)
                #上图绿色方框的情形
                break
            
        return price%(10**9+7)

5564. 通过指令创建有序数组

直接模拟,虽然此种方法时间复杂度是 O ( n 2 ) O(n^2) O(n2),但是居然能过…
bisect包中,bisect_left返回是左插入的位置,也就是说有多少个元素比他小,bisect_right是在右边插入的位置,用数组长度相减就是有多少个元素比他大,也就是题目所求的代价。
由于相等的不考虑,所以直接使用insort,不用考虑left或者right的情形。

class Solution:
    def createSortedArray(self, instructions: List[int]) -> int:
        nums = []
        ans = 0
        for ni in instructions:
            l = bisect.bisect_left(nums, ni)
            r = len(nums) - bisect.bisect_right(nums, ni)
            ans += min(l, r)
            bisect.insort(nums, ni)
        
        return ans%(10**9+7)

你可能感兴趣的:(Leetcode刷题,数据结构,leetcode,列表,python,算法)