力扣启动
T1
给你一个整数数组 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 的上限为。贴一下蛙佬的代码了:)
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
给你一个数组 maximumHeight
,其中 maximumHeight[i]
表示第 i
座塔可以达到的 最大 高度。
你的任务是给每一座塔分别设置一个高度,使得:
- 第
i
座塔的高度是一个正整数,且不超过maximumHeight[i]
。 - 所有塔的高度互不相同。
请你返回设置完所有塔的高度后,可以达到的 最大 总高度。如果没有合法的设置,返回 -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;
}
};