P1. 获取生成数组中的最大值
给你一个整数 njie jjj 。按下述规则生成一个长度为 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 中的 最大 值。
class Solution:
def getMaximumGenerated(self, n: int) -> int:
if n == 0: return 0
A = [0] * (n + 1)
A[0], A[1] = 0, 1
ret = 1
for i in range(n+1):
if i & 1:
k = i >> 1
A[i] = A[k] + A[k+1]
else:
k = i >> 1
A[i] = A[k]
ret = max(ret, A[i])
return ret
P2. 字符频次唯一的最小删除次数
如果字符串 s 中 不存在 两个不同字符 频次 相同的情况,就称 s 是 优质字符串 。
给你一个字符串 s,返回使 s 成为 优质字符串 需要删除的 最小 字符数。
字符串中字符的 频次 是该字符在字符串中的出现次数。例如,在字符串 “aab” 中,‘a’ 的频次是 2,而 ‘b’ 的频次是 1 。
import collections
class Solution:
def minDeletions(self, s: str) -> int:
c = collections.Counter(s)
A = c.values()
ret = 0
while len(A) > 1:
A = sorted(A)[::-1]
if A[0] != A[1]:
del A[0]
else:
A[1] -= 1
ret += 1
if A[1] == 0:
del A[1]
return ret
P3. 销售价值减少的颜色球
你有一些球的库存 inventory ,里面包含着不同颜色的球。一个顾客想要 任意颜色 总数为 orders 的球。
这位顾客有一种特殊的方式衡量球的价值:每个球的价值是目前剩下的 同色球 的数目。比方说还剩下 6 个黄球,那么顾客买第一个黄球的时候该黄球的价值为 6 。这笔交易以后,只剩下 5 个黄球了,所以下一个黄球的价值为 5 (也就是球的价值随着顾客购买同色球是递减的)
给你整数数组 inventory ,其中 inventory[i] 表示第 i 种颜色球一开始的数目。同时给你整数 orders ,表示顾客总共想买的球数目。你可以按照 任意顺序 卖球。
请你返回卖了 orders 个球以后 最大 总价值之和。由于答案可能会很大,请你返回答案对 109 + 7 取余数 的结果。
class Solution:
def maxProfit(self, inventory: List[int], orders: int) -> int:
c = collections.Counter(inventory)
A = []
mod = 10 ** 9 + 7
ret = 0
for k, v in c.items():
A.append((k, v))
A = sorted(A)[::-1]
print(A)
def f(a, b, orders):
p, q = divmod(orders, b)
delta = b * (a + a - p + 1) * p // 2 + q * (a - p)
return delta % mod
while orders:
if len(A) == 1:
a, b = A[0]
return (ret + f(a, b, orders)) % mod
else:
a, b = A[0]
a1, b1 = A[1]
if (a - a1) * b >= orders:
return (ret + f(a, b, orders)) % mod
else:
A[1] = (a1, b1+ b)
orders -= (a - a1) * b
ret = (ret + f(a, b, (a - a1) * b)) % mod
del A[0]
return ret
P4. 通过指令创建有序数组
给你一个整数数组 instructions ,你需要根据 instructions 中的元素创建一个有序数组。一开始你有一个空的数组 nums ,你需要 从左到右 遍历 instructions 中的元素,将它们依次插入 nums 数组中。每一次插入操作的 代价 是以下两者的 较小值 :
nums 中 严格小于 instructions[i] 的数字数目。
nums 中 严格大于 instructions[i] 的数字数目。
比方说,如果要将 3 插入到 nums = [1,2,3,5] ,那么插入操作的 代价 为 min(2, 1) (元素 1 和 2 小于 3 ,元素 5 大于 3 ),插入后 nums 变成 [1,2,3,3,5] 。
请你返回将 instructions 中所有元素依次插入 nums 后的 总最小代价 。由于答案会很大,请将它对 109 + 7 取余 后返回。
import bisect
class Solution:
def createSortedArray(self, instructions: List[int]) -> int:
ret = 0
A = []
mod = 10 ** 9 + 7
for x in instructions:
n = len(A)
pl = bisect.bisect_left(A, x)
pr = bisect.bisect_right(A, x)
ret = (ret + min(pl, n - pr) ) % mod
bisect.insort(A, x)
return ret