思路:本体可以采用排序+最长递增子序列(动态规划),按照 ages 从小到大排序,scores 通过相同方法变换, 只有当 scores[i] >= scores[j] 才可以满足无矛盾的条件,才可以更新 dp 。dp[i] = max(dp[j] + nums[i]);
本题可以扩展出一种排序的方法,因为要通过同一种逻辑对两个数组分别进行排序,那么可以新建一个id数组,表示球员们的序号下标,那么用所需逻辑对ids数组进行排序,之后遍历的时候通过遍历ids数组来取数即可。排序方法可以采用java的Arrays工具类封装方法,
Arrays.sort(ids, (i, j) -> ages[i] != ages[j] ? ages[i] - ages[j] : scores[i] - scores[j]);
需要注意一点,ids 必须是封装类,不然会报错:
E:\leetcode\src\leetcode_1626.java:24:15
java: 对于sort(int[],(i,j)->age[...]es[j]), 找不到合适的方法
方法 java.util.Arrays.<T>sort(T[],java.util.Comparator<? super T>)不适用
(推论变量 T 具有不兼容的限制范围
等式约束条件: int
上限: java.lang.Object)
方法 java.util.Arrays.<T>sort(T[],int,int,java.util.Comparator<? super T>)不适用
(无法推断类型变量 T
(实际参数列表和形式参数列表长度不同))
还有,在年龄相同时,必须要让分数值小的在前,因为题意是相同年龄的球员不会产生矛盾,因此该值是需要计算的,因此年龄相等时必须得满足 if (scores[cur] >= scores[pre]) 。
代码如下:
class Solution {
public int bestTeamScore(int[] scores, int[] ages) {
int n = ages.length;
int max = 0;
Integer[] ids = new Integer[n];
int[] dp = new int[n];
for (int i = 0; i < n; ++i) {
ids[i] = i;
}
Arrays.sort(ids, (i, j) -> ages[i] != ages[j] ? ages[i] - ages[j] : scores[i] - scores[j]);
for (int i = 0; i < n; i++) {
int cur = ids[i];
dp[cur] = scores[cur];
for (int j = 0; j < i; j++) {
int pre = ids[j];
if (scores[cur] >= scores[pre]){
dp[cur] = Math.max(dp[cur], dp[pre] + scores[cur]);
}
}
max = Math.max(dp[cur], max);
}
return max;
}
}