1626. 无矛盾的最佳球队+双数组排序方法

1626. 无矛盾的最佳球队

思路:本体可以采用排序+最长递增子序列(动态规划),按照 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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值