ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LeetCode 第214场周赛 个人心得

2020-11-08 12:33:19  阅读:282  来源: 互联网

标签:周赛 214 nums int 示例 LeetCode inventory 字符串 orders


成绩:40min 前两题 第三题死在超时

第一题:

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

给你一个整数 n 。按下述规则生成一个长度为 n + 1 的数组 nums :

  • nums[0] = 0
  • nums[1] = 1
  • 当 2 <= 2 * i <= n 时,nums[2 * i] = nums[i]
  • 当 2 <= 2 * i + 1 <= n 时,nums[2 * i + 1] = nums[i] + nums[i + 1]

返回生成数组 nums 中的 最大 值。

 

示例 1:

输入:n = 7
输出:3
解释:根据规则:
  nums[0] = 0
  nums[1] = 1
  nums[(1 * 2) = 2] = nums[1] = 1
  nums[(1 * 2) + 1 = 3] = nums[1] + nums[2] = 1 + 1 = 2
  nums[(2 * 2) = 4] = nums[2] = 1
  nums[(2 * 2) + 1 = 5] = nums[2] + nums[3] = 1 + 2 = 3
  nums[(3 * 2) = 6] = nums[3] = 2
  nums[(3 * 2) + 1 = 7] = nums[3] + nums[4] = 2 + 1 = 3
因此,nums = [0,1,1,2,1,3,2,3],最大值 3

示例 2:

输入:n = 2
输出:1
解释:根据规则,nums[0]、nums[1] 和 nums[2] 之中的最大值是 1

示例 3:

输入:n = 3
输出:2
解释:根据规则,nums[0]、nums[1]、nums[2] 和 nums[3] 之中的最大值是 2

 

提示:

  • 0 <= n <= 100

比较简单,但写时需要注意的是,对数组的更改应该是按位的,不能先执行一遍偶数项再执行奇数项,后者将导致结果完全错误。

class Solution:
    def getMaximumGenerated(self, n: int) -> int:
        if n == 0:
            return 0
        nums = [0 for i in range(n + 1)]
        nums[0] = 0
        nums[1] = 1
        i = 1
        while 2 * i <= n or 2 * i + 1 <= n:
            nums[2 * i] = nums[i]
            if 2 * i + 1 <= n:
                nums[2 * i + 1] = nums[i] + nums[i + 1]
            i += 1
        return max(nums)

 

第二题:

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

如果字符串 s 中 不存在 两个不同字符 频次 相同的情况,就称 s 是 优质字符串 。

给你一个字符串 s,返回使 s 成为 优质字符串 需要删除的 最小 字符数。

字符串中字符的 频次 是该字符在字符串中的出现次数。例如,在字符串 "aab" 中,'a' 的频次是 2,而 'b' 的频次是 1 。

 

示例 1:

输入:s = "aab"
输出:0
解释:s 已经是优质字符串。
示例 2:

输入:s = "aaabbbcc"
输出:2
解释:可以删除两个 'b' , 得到优质字符串 "aaabcc" 。
另一种方式是删除一个 'b' 和一个 'c' ,得到优质字符串 "aaabbc" 。
示例 3:

输入:s = "ceabaacb"
输出:2
解释:可以删除两个 'c' 得到优质字符串 "eabaab" 。
注意,只需要关注结果字符串中仍然存在的字符。(即,频次为 0 的字符会忽略不计。)
 

提示:

1 <= s.length <= 105
s 仅含小写英文字母

 本题也没有难度,先用set找出字符串中不重复的字符,然后按位统计字符出现的次数存入list,在list中将重复的项-1,直至该项在list中只出现一次为止,统计-1执行的次数。

注意:当被-1的项为0时,我们忽略该项。

class Solution:
    def minDeletions(self, s: str) -> int:
        s2 = set(s)
        s3 = list(s2)
        num_occur = []
        cnt = 0
        for i in s3:
            num_occur.append(s.count(i))
        for i in range(len(num_occur)):
            while (num_occur[i] != 0) and (num_occur.count(num_occur[i]) > 1):
                num_occur[i] -= 1
                cnt += 1
                
        return cnt

 

第三题:

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

你有一些球的库存 inventory ,里面包含着不同颜色的球。一个顾客想要 任意颜色 总数为 orders 的球。

这位顾客有一种特殊的方式衡量球的价值:每个球的价值是目前剩下的 同色球 的数目。比方说还剩下 6 个黄球,那么顾客买第一个黄球的时候该黄球的价值为 6 。这笔交易以后,只剩下 5 个黄球了,所以下一个黄球的价值为 5 (也就是球的价值随着顾客购买同色球是递减的)

给你整数数组 inventory ,其中 inventory[i] 表示第 i 种颜色球一开始的数目。同时给你整数 orders ,表示顾客总共想买的球数目。你可以按照 任意顺序 卖球。

请你返回卖了 orders 个球以后 最大 总价值之和。由于答案可能会很大,请你返回答案对 109 + 7 取余数 的结果。

 

示例 1:


输入:inventory = [2,5], orders = 4
输出:14
解释:卖 1 个第一种颜色的球(价值为 2 ),卖 3 个第二种颜色的球(价值为 5 + 4 + 3)。
最大总和为 2 + 5 + 4 + 3 = 14 。
示例 2:

输入:inventory = [3,5], orders = 6
输出:19
解释:卖 2 个第一种颜色的球(价值为 3 + 2),卖 4 个第二种颜色的球(价值为 5 + 4 + 3 + 2)。
最大总和为 3 + 2 + 5 + 4 + 3 + 2 = 19 。
示例 3:

输入:inventory = [2,8,4,10,6], orders = 20
输出:110
示例 4:

输入:inventory = [1000000000], orders = 1000000000
输出:21
解释:卖 1000000000 次第一种颜色的球,总价值为 500000000500000000 。 500000000500000000 对 109 + 7 取余为 21 。
 

提示:

1 <= inventory.length <= 105
1 <= inventory[i] <= 109
1 <= orders <= min(sum(inventory[i]), 109)

用了最简单的思路去解,即每次找出价值最大的,将该价值累加到value,然后对列表中该项-1,对要取的球的数量-1,直到要取的球的数量为0.

这种思路简单的代价就是超时,如执行

[773160767] 252264991 时很明显会发生超时。
class Solution:
    def maxProfit(self, inventory: List[int], orders: int) -> int:
        if len(inventory) == 1 and orders == inventory[0]:
            return ((inventory[0] // 2) * (inventory[0] + 1) % (10 ** 9 + 7))
        value = 0
        while orders > 0:
            value += max(inventory)
            inventory[inventory.index(max(inventory))] -= 1
            orders -= 1
        
        return value % (10 ** 9 + 7)

苦思冥想很久,最终决定优化if中return的公式。比赛期间优化的最终结果如下:

class Solution:
    def maxProfit(self, inventory: List[int], orders: int) -> int:
        if len(inventory) == 1:
            return (((inventory[0] - orders // 2) * 2 + 1) * (orders // 2)) % (10 ** 9 + 7)
        value = 0
        while orders > 0:
            value += max(inventory)
            inventory[inventory.index(max(inventory))] -= 1
            orders -= 1
        
        return value % (10 ** 9 + 7)

 

但执行时结果错误。

本周周赛经历就到此为止了,赶紧去第三题评论区蹲题解。

标签:周赛,214,nums,int,示例,LeetCode,inventory,字符串,orders
来源: https://www.cnblogs.com/sqyl/p/13943947.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有