3397. 执行操作后不同元素的最大数量
问题
给你一个整数数组 nums 和一个整数 k。
你可以对数组中的每个元素 最多 执行 一次 以下操作:
将一个在范围 [-k, k] 内的整数加到该元素上。
返回执行这些操作后,nums 中可能拥有的不同元素的 最大 数量。
示例 1:
输入: nums = [1,2,2,3,3,4], k = 2
输出: 6
解释:
对前四个元素执行操作,nums 变为 [-1, 0, 1, 2, 3, 4],可以获得 6 个不同的元素。
分析
贪心,找不同元素的最大数量,那么就尽可能让元素不同。从小到大排序,让小的更小,比如3 3 4 5,k=2,让3-2=1,然后第二个3尽可能比第一个1多一点点,但是不能小于nums[1]-k,又不能大于nums[1]+k,所以是min(max(nums[1]-k, nums[0]+1), nums[1]+k)。遍历的时候可以记录不同元素数量,也就是结果。
代码
class Solution {
public:
int maxDistinctElements(vector<int>& nums, int k) {
int n = nums.size();
sort(nums.begin(), nums.end());
int res = 1;
nums[0] -= k;
for (int i = 1; i < n; i++) {
// 按照贪心策略,nums[i]最小应该等于nums[i-1]+1,但是按照题意,最小是nums[i]-k,所以取二者最大。然而,不能超过nums[i]+k。
nums[i] = min(max(nums[i-1]+1, nums[i]-k), nums[i]+k);
if (nums[i] != nums[i-1]) {res++;}
}
return res;
}
};

浙公网安备 33010602011771号