列表

详情


3301. 高度互不相同的最大塔高和

给你一个数组 maximumHeight ,其中 maximumHeight[i] 表示第 i 座塔可以达到的 最大 高度。

你的任务是给每一座塔分别设置一个高度,使得:

  1. i 座塔的高度是一个正整数,且不超过 maximumHeight[i] 。
  2. 所有塔的高度互不相同。

请你返回设置完所有塔的高度后,可以达到的 最大 总高度。如果没有合法的设置,返回 -1 。

 

示例 1:

输入:maximumHeight = [2,3,4,3]

输出:10

解释:

我们可以将塔的高度设置为:[1, 2, 4, 3] 。

示例 2:

输入:maximumHeight = [15,10]

输出:25

解释:

我们可以将塔的高度设置为:[15, 10] 。

示例 3:

输入:maximumHeight = [2,2,1]

输出:-1

解释:

无法设置塔的高度为正整数且高度互不相同。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: long long maximumTotalSum(vector<int>& maximumHeight) { } };

cpp 解法, 执行用时: 235 ms, 内存消耗: 116 MB, 提交时间: 2024-10-15 17:47:04

class Solution {
public:
    long long maximumTotalSum(vector<int>& maximumHeight) {
        ranges::sort(maximumHeight, greater()); // 从大到小排序
        for (int i = 1; i < maximumHeight.size(); i++) {
            maximumHeight[i] = min(maximumHeight[i], maximumHeight[i - 1] - 1);
            if (maximumHeight[i] <= 0) {
                return -1;
            }
        }
        return reduce(maximumHeight.begin(), maximumHeight.end(), 0LL);
    }
};

java 解法, 执行用时: 57 ms, 内存消耗: 56.8 MB, 提交时间: 2024-10-15 17:46:42

class Solution {
    public long maximumTotalSum(int[] maximumHeight) {
        Arrays.sort(maximumHeight); // 从小到大排序,下面倒着遍历
        int n = maximumHeight.length;
        long ans = maximumHeight[n - 1];
        for (int i = n - 2; i >= 0; i--) {
            maximumHeight[i] = Math.min(maximumHeight[i], maximumHeight[i + 1] - 1);
            if (maximumHeight[i] <= 0) {
                return -1;
            }
            ans += maximumHeight[i];
        }
        return ans;
    }
}

python3 解法, 执行用时: 335 ms, 内存消耗: 31.9 MB, 提交时间: 2024-10-15 17:46:28

class Solution:
    def maximumTotalSum(self, maximumHeight: List[int]) -> int:
        maximumHeight.sort(reverse=True)  # 倒序
        for i in range(1, len(maximumHeight)):
            maximumHeight[i] = min(maximumHeight[i], maximumHeight[i - 1] - 1)
            if maximumHeight[i] <= 0:
                return -1
        return sum(maximumHeight)

golang 解法, 执行用时: 222 ms, 内存消耗: 10.1 MB, 提交时间: 2024-10-15 17:45:08

/*
从最大元素开始贪心
数组的最大值 m 不变是最好的。反证:如果把 m 变小是最优的,那么把 m 恢复成其原来的值,
仍然满足题目要求,且我们得到了更优的答案,矛盾。
数组的次大值呢?如果它等于 m,那么它必须变成 m−1,否则不变。
依此类推。
*/
func maximumTotalSum(maximumHeight []int) int64 {
	slices.SortFunc(maximumHeight, func(a, b int) int { return b - a })
	ans := maximumHeight[0]
	for i := 1; i < len(maximumHeight); i++ {
		maximumHeight[i] = min(maximumHeight[i], maximumHeight[i-1]-1)
		if maximumHeight[i] <= 0 {
			return -1
		}
		ans += maximumHeight[i]
	}
	return int64(ans)
}

上一题