【LeetCode】力扣140th双周赛部分题解

力扣启动


T1

3300. 替换为数位和以后的最小元素

给你一个整数数组 nums 。

请你将 nums 中每一个元素都替换为它的各个数位之  。

请你返回替换所有元素以后 nums 中的 最小 元素。

示例 1:

输入:nums = [10,12,13,14]

输出:1

解释:

nums 替换后变为 [1, 3, 4, 5] ,最小元素为 1 。

示例 2:

输入:nums = [1,2,3,4]

输出:1

解释:

nums 替换后变为 [1, 2, 3, 4] ,最小元素为 1 。

示例 3:

输入:nums = [999,19,199]

输出:10

解释:

nums 替换后变为 [27, 10, 19] ,最小元素为 10 。

提示:

  • 1 <= nums.length <= 100
  • 1 <= nums[i] <= 10^4

模拟。复杂度为O(nlogA),其中A 的上限为10^{^{4}}。贴一下蛙佬的代码了:)

class Solution {
public:
    int minElement(vector<int>& nums) {
        int mn = 1e9;
        for (int x : nums) {
            int t = 0;
            for (; x; x /= 10) t += x % 10;
            mn = min(mn, t);
        }
        return mn;
    }
};

T2

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

解释:

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

提示:

  • 1 <= maximumHeight.length <= 10^5
  • 1 <= maximumHeight[i] <= 10^9

贪心。

为了让总高度最大,应该按最大高度从大到小设置高度,每次将塔高设置为当前还未被使用的最大值。具体维护方式详见参考代码。复杂度 O(nlogn),主要是排序的复杂度。这里还是参考蛙佬的,毕竟我写的又臭又烂hhh.

class Solution {
public:
    long long maximumTotalSum(vector<int>& maximumHeight) {
        // 将最大高度从大到小排序
        sort(maximumHeight.begin(), maximumHeight.end());
        reverse(maximumHeight.begin(), maximumHeight.end());
        // now 表示当前还未被使用的最大值
        long long ans = 0, now = 2e9;
        for (int x : maximumHeight) {
            // 和最大塔高取 min
            now = min(now, 1LL * x);
            // 可以使用的值已经不是正数,无解
            if (now <= 0) return -1;
            ans += now;
            // 为什么上一次被使用的值减 1 就是未被使用的最大值?
            // 因为我们设置的塔高是递减的
            now--;
        }
        return ans;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值