给定一个由N个元素组成的数组arr [] ,任务是通过对数组的每个元素进行以下任一给定操作来最大化数组中不同元素的数量:
- 将元素增加1
- 或将元素减少1
- 或保持原样。
注意:任何元素都不能小于或等于0。
例子:
Input: arr = [4, 4, 5, 5, 5, 5, 6, 6]
Output: 5
Explanation: After modification of each element of the array in any of the three possible ways, arr[] = [3, 4, 5, 5, 5, 5, 6, 7]. Here distinct elements are 5.
Input: arr = [1, 1, 1, 8, 8, 8, 9, 9]
Output: 6
Explanation: After modification of each element of the array in any of the three possible ways, arr[] = [1, 1, 2, 7, 8, 8, 9, 10]. Here distinct elements are 6.
方法:想法是首先对给定的数组进行排序,以便可以通过与相邻元素进行比较轻松地检查元素(如果有区别的话)。
- 首先,对数组的所有元素进行排序。
- 将变量count和prev初始化为0。(分别存储不同元素和前一个元素的计数。)
- 之后,使用prev变量跟踪前一个元素。
- 迭代排序后的数组。
- 将当前元素的值减小1,然后检查前一个元素是否小于减小的值。如果较小,则增加计数并将当前值分配给prev 。
- 如果当前元素的减小值不大于前一个元素,则保持当前元素不变,并检查前一个元素是否小于当前元素。如果较小,则增加计数并将当前值分配给prev 。
- 如果当前值不大于前一个元素,则将当前值增加1并检查前一个元素是否小于递增的当前元素。如果较小,则增加计数并将当前值分配给prev 。
- 如果当前元素的增量值不小于先前值,则跳过该元素。
下面是上述方法的实现:
C++
Java
Python3
C#
输出:
时间复杂度: O(N * logN)