超市里的货物架调整&观光景点组合得分问题

超市里的货物架调整

问题描述

在一个超市里,有一个包含 n 个格子的货物架,每个格子中放有一种商品,商品用小写字母 az 表示。当顾客进入超市时,他们会依次从第一个格子查找到第 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值