力扣算法:6316-重排数组以得到最大前缀分数

6316-重排数组以得到最大前缀分数

题目:

给你一个下标从 0 开始的整数数组 nums 。你可以将 nums 中的元素按 任意顺序 重排(包括给定顺序)。
令 prefix 为一个数组,它包含了 nums 重新排列后的前缀和。换句话说,prefix[i] 是 nums 重新排列后下标从 0 到 i 的元素之和。nums 的 分数 是 prefix 数组中正整数的个数。
返回可以得到的最大分数。

示例 1:
输入:nums = [2,-1,0,1,-3,3,-3]
输出:6
解释:数组重排为 nums = [2,3,1,-1,-3,0,-3] 。
prefix = [2,5,6,5,2,2,-1] ,分数为 6 。
可以证明 6 是能够得到的最大分数。

示例 2:
输入:nums = [-2,-3,0]
输出:0
解释:不管怎么重排数组得到的分数都是 0 。

解答:

class Solution {
    public int maxScore(int[] nums) {
        // 结果:最大分数
        int result = 0;
        // 数值总和
        long sum = 0;
        // 存放正数的集合
        List<Integer> list1 = new ArrayList<>();
        // 存放非正数的集合
        List<Integer> list2 = new ArrayList<>();
        for (int num : nums) {
            if (num > 0) {
                list1.add(num);
                sum += num;
            } else {
                list2.add(num);
            }
        }
        result = list1.size();
        // 将非正数集合按升序排序
        Collections.sort(list2);
        // 将非正数集合反序,即降序排序
        Collections.reverse(list2);
        for (int num : list2) {
            sum += num;
            if (sum > 0) {
                result++;
            } else {
                break;
            }
        }
        return result;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值