【1626. 无矛盾的最佳球队】
创始人
2025-06-01 15:33:37
0次

来源:力扣(LeetCode)

描述:

假设你是球队的经理。对于即将到来的锦标赛,你想组合一支总体得分最高的球队。球队的得分是球队中所有球员的分数 总和 。

然而,球队中的矛盾会限制球员的发挥,所以必须选出一支 没有矛盾 的球队。如果一名年龄较小球员的分数 严格大于 一名年龄较大的球员,则存在矛盾。同龄球员之间不会发生矛盾。

给你两个列表 scores 和 ages,其中每组 scores[i] 和 ages[i] 表示第 i 名球员的分数和年龄。请你返回 所有可能的无矛盾球队中得分最高那支的分数 。

示例 1:

输入:scores = [1,3,5,10,15], ages = [1,2,3,4,5]
输出:34
解释:你可以选中所有球员。

示例 2:

输入:scores = [4,5,6,5], ages = [2,1,2,1]
输出:16
解释:最佳的选择是后 3 名球员。注意,你可以选中多个同龄球员。

示例 3:

输入:scores = [1,2,3,5], ages = [8,9,10,1]
输出:6
解释:最佳的选择是前 3 名球员。

提示:

  • 1 <= scores.length, ages.length <= 1000
  • scores.length == ages.length
  • 1 <= scores[i] <= 106
  • 1 <= ages[i] <= 1000

方法:动态规划

思路与算法

题目给出 n 名球员的分数和年龄数组 scores 和 ages,其中 scores[i] 和 ages[i] 分别为球员 i 的分数和年龄。当一名年龄较小球员的分数严格大于一名年龄较大的球员,则存在矛盾。同龄球员之间不会发生矛盾。球队的得分是球队中所有球员分数的总和,现在我们需要求所有可能的无矛盾的球队的最高分数。

首先我们将所有队员按照分数升序进行排序,分数相同时,则按照年龄升序进行排序,我们用数组 people[n][2] 来表示排序后的 n 名球员信息,其中 people[i][0], people[i][1] 分别为排序后第 i 名球员的分数和年龄。然后我们可以用动态规划来解决该问题,设 dp[i] 为我们最后组建的球队中的最大球员序号为排序后的第 i 名球员时的球队最大分数(此时的球员序号为排序后的新序号),因为我们是按照分数升序排序的,所以最后组建球队的最后一名球员的分数一定不会小于队伍中该球员前面一名球员的分数,所以为了避免矛盾的产生我们只需要让最后组建球队的最后一名球员的年龄不小于该球员前面一名球员的年龄即可,那么转移的方程如下:

dp[i] = max{dp[j]} + people[i][0], j < i & people[j][1] ≤ people[i][1]    (1)

上文讨论的是建立在 i > 0 的前提上的,我们还需要考虑动态规划的边界条件,当 i = 0 时,只有一名球员 people[0],此时该球员单独组成一只队伍有: dp[0] = people[0][0]。最后我们返回 max{dp[i], 0 ≤ i < n} 即为所有可能的无矛盾的球队的最高分数。

代码:

class Solution {
public:int bestTeamScore(vector& scores, vector& ages) {int n = scores.size();vector> people;for (int i = 0; i < n; ++i) {people.push_back({scores[i], ages[i]});}sort(people.begin(), people.end());vector dp(n, 0);int res = 0;for (int i = 0; i < n; ++i) {for (int j = i - 1; j >= 0; --j) {if (people[j].second <= people[i].second) {dp[i] = max(dp[i], dp[j]);}}dp[i] += people[i].first;res = max(res, dp[i]);}return res;}
};

执行用时:140 ms, 在所有 C++ 提交中击败了75.29%的用户
内存消耗:19.4 MB, 在所有 C++ 提交中击败了28.24%的用户
复杂度分析
时间复杂度:O(n2),其中 n 为数组 scores 和 ages 的长度,其中排序的时间复杂度为 O(n×logn),求解每一个状态的复杂度为 O(n),共有 n 个状态需要求解,所以求解动态规划的总时间复杂度为 O(n2)。
空间复杂度:O(n),其中 n 为数组 scores 和 ages 的长度。空间复杂度主要取决于动态规划模型中状态的总数。

方法二:动态规划【树状数组优化】

思路与算法

对于上述动态规划的过程我们也可以用「树状数组」或者「线段树」来进行优化,因为两者优化的思想类似,所以本文中用「树状数组」来进行说明。

在求解过程中以每一个球员为最后组建球队的最后一名球员,我们此时用「树状数组」来维护以该球员的年龄的最大队伍分数。通过方法一种动态规划的转移方程我们可以看到对于某一个状态 dp[i] 的求解我们只需要知道当前「树状数组」中以年龄区间为 [0,people[i][1]] 结尾的组建队伍的最大分数即可。通过「树状数组」我们可以在 O(logn) 的时间复杂度中完成该问题的查询和更新信息,这样对于求解每一个状态的时间复杂度就从 O(n) 降到了 O(logn)。

代码:

class Solution {
public:int max_age;vector t;vector> people;int lowbit(int x) {return x & (-x);}void update(int i, int val) {for (; i <= max_age; i += lowbit(i)) {t[i] = max(t[i], val);}}int query(int i) {int ret = 0;for (; i > 0; i -= lowbit(i)) {ret = max(ret, t[i]);}return ret;}int bestTeamScore(vector& scores, vector& ages) {max_age = *max_element(ages.begin(), ages.end());t = vector(max_age + 1, 0);int res = 0;for (int i = 0; i < scores.size(); ++i) {people.push_back({scores[i], ages[i]});}sort(people.begin(), people.end());for (int i = 0; i < people.size(); ++i) {int score = people[i].first, age = people[i].second, cur = score + query(age);update(age, cur);res = max(res, cur);}return res;}
};

执行用时:20 ms, 在所有 C++ 提交中击败了98.24%的用户
内存消耗:19.3 MB, 在所有 C++ 提交中击败了37.06%的用户
复杂度分析
时间复杂度:O(n×logn),其中 n 为数组 scores 和 ages 的长度,其中排序的时间复杂度为 O(n×logn),优化后用「树状数组」来求解每一个状态的复杂度为 O(logn),共有 n 个状态需要求解,所以求解动态规划的总时间复杂度为 O(n×logn)。
空间复杂度:O(n),其中 n 为数组 scores 和 ages 的长度。空间复杂度主要取决于动态规划模型中状态的总数。
author:LeetCode-Solution

相关内容

热门资讯

在大吉订购APP订购交易亏损被...   近期,不少投资者反映在“大吉订购App”上投资白银、铂金等商品遭遇严重亏损。该平台宣称提供现货订...
铂银壹号APP商品订购交易亏损...   许多中小投资者误以为网上的“商品现货订购”是合规合法的理财渠道,殊不知这背后隐藏着巨大的合规风险...
兴鑫淘金APP贵金属订购交易亏...   白银、贵金属或其他商品类投资,除国家批准的正规期货交易场所及持牌期货公司外,市面上大量第三方交易...
铂银掘金APP无资质的违规平台...   铂银掘金等平台的投资者,往往是被“注册送现金”“充值返现券”“首单免亏”等广告话术吸引,进而下载...
八方淘金APP订购交易不合规,...   “八方淘金APP”“铂银掘金APP”“铂银壹号APP”等软件被指以“现货订购”为名,实际采用高杠...
在指尖订购APP订购商品亏损被...   指尖订购APP这类平台,表面是“订购交易”,实则是披着电商外衣的非法期货陷阱。绝大多数投资者被蒙...
在犀贝易购APP做商品订购交易...   市面上打着“现货投资”“贵金属交易”旗号的APP并不少,但真正合规、受监管的平台并不多。犀贝易购...
易达淘金APP虚假商品订购交易...   易达淘金APP存在严重的虚假宣传与违规交易行为。该平台打着“商品订购”的旗号,实则通过不合规的交...
大浪淘金APP白银订购亏损被骗...   大浪淘金APP最隐蔽的套路,在于其完全封闭的内盘交易系统。表面上,它宣称与国际贵金属市场接轨;实...
一品好购APP上订购白银出现亏...   一品好购APP原名“一品订购”,运营方为上海宝智未来信息技术有限公司。近期不少投资者反映在该平台...
九州订购APP贵金属订购投资骗...   九州订购APP正通过抖.音、快手、今日头条等平台大量投放投资广告,用“5元起投”“充值返现”“0...
坚锅淘金APP交易软件并不正规...   当前,市面上大量所谓的“现货商城订购”交易软件,早已偏离了正常的实物商品买卖,演变为高杠杆、高手...
斗金订购APP贵金属期货交易骗...   斗金订购APP的投资者往往被铺天盖地的广告宣传所诱导——注册即送现金、充值返现券等看似诱人的福利...
警惕!云启购APP违规经营,披...   "5元起投、充值返现、稳赚不赔"——这些诱人的广告语背后,可能是一个精心设计的金融陷阱。  近期...
量子淘金APP贵金属投资不合规...   "4元起投""充值返券""月入过万"——这些极具诱惑力的广告语在短视频平台、社交软件上铺天盖地。...
鑫汇智投APP贵金属商品订购骗...   鑫汇智投APP非法期货投资骗局,受害者在投资过程中根本不懂交易,也不去研究和验证这个平台是否正规...
矅光智策APP平台违规经营非法...   矅光智策APP对外宣称是“商城订购”“现货交易”,但查询其经营范围,并未显示具备开展现货期货交易...
黄金珠宝怎么选?内侧刻字都代表... 潮新闻客户端 记者 马焱 通讯员 任倩影 9月8日下午,“云游杭州 乐购金秋”——“浙城·浙放心”活...
原创 冰... 最近全球国债市场正在上演魔幻一幕: 美债、日债、欧债遭遇猛烈抛售,收益率冲到几十年新高,美国财政部都...
日韩股市开盘表现分化 上证报中国证券网讯 9月9日,日韩股市开盘表现分化,韩国综合指数开盘上涨0.26%,报6972.87...