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;
    }
};
posted @ 2025-10-18 14:50  saulstavo  阅读(8)  评论(0)    收藏  举报