超市里的货物架调整
问题描述
在一个超市里,有一个包含 n 个格子的货物架,每个格子中放有一种商品,商品用小写字母 a
到 z
表示。当顾客进入超市时,他们会依次从第一个格子查找到第 n 个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。
作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。输入变量说明:
-
n
:货物架的格子数 -
m
:顾客想要购买的商品种类数 -
s
:货物架上商品的初始顺序 -
c
:顾客想要购买的商品种类
测试样例
样例1:
输入:
n = 3 ,m = 4 ,s = "abc" ,c = "abcd"
输出:3
样例2:
输入:
n = 4 ,m = 2 ,s = "abbc" ,c = "bb"
输出:2
样例3:
输入:
n = 5 ,m = 4 ,s = "bcdea" ,c = "abcd"
输出:4
思路:很简单,没有顺序,直接数数量即可,时间复杂度O(n)
def solution(n: int, m: int, s: str, c: str) -> int:
# write code here
goods = {}
needs = {}
for i in s:
goods[i] = goods.get(i, 0) + 1
for i in c:
needs[i] = needs.get(i, 0) + 1
num = 0
for k in needs:
num += min(goods.get(k, 0), needs.get(k, 0))
return num
观光景点组合得分问题
问题描述
小R正在研究一组观光景点,每个景点都有一个评分,保存在数组 values
中,其中 values[i]
表示第 i
个观光景点的评分。同时,景点之间的距离由它们的下标差 j - i
表示。
一对景点 (i < j)
的观光组合得分为 values[i] + values[j] + i - j
,也就是两者评分之和减去它们之间的距离。
小R想知道,在哪种情况下能够获得观光景点组合的最高得分。
测试样例
样例1:
输入:
values = [8, 3, 5, 5, 6]
输出:11
样例2:
输入:
values = [10, 4, 8, 7]
输出:16
样例3:
输入:
values = [1, 2, 3, 4, 5]
输出:8
思路一:两次循环,两两组合找最大。时间复杂度O(n^2)
def solution(values: list) -> int:
# write code here
max_value = 0
n = len(values)
for x in range(n - 1):
for y in range(x + 1, n):
max_value = max(max_value, values[x] + values[y] + x - y)
return max_value # Placeholder return
思路二:
给定的组合得分为:
我们可以将其重写为:
设定:
于是得分可以转化为:
在这种情况下,我们只需要遍历 values
数组一次,计算出所有的 A[i]
和 B[j]
,然后在遍历中更新最大得分。
时间复杂度O(n)
def solution(values: list) -> int:
# write code here
n = len(values)
max_score = 0
maxA = values[0] + 0 # A[0] = values[0] + 0
for j in range(1, n):
# 计算 B[j] = values[j] - j
currentB = values[j] - j
# 计算得分
max_score = max(max_score, maxA + currentB)
# 更新 maxA
maxA = max(maxA, values[j] + j)
return max_score