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. 销售价值减少的颜色球
贪心算法,永远优先卖最贵的。
具体就是先从大到小排序,然后按阶梯来卖球。
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)