问题背景
给你一个整数数组 numsnumsnums 和一个整数 kkk。
如果一个数组中所有 严格大于 hhh 的整数值都 相等 ,那么我们称整数 hhh 是 合法的 。
比方说,如果 nums=[10,8,10,8]nums = [10, 8, 10, 8]nums=[10,8,10,8],那么 h=9h = 9h=9 是一个 合法 整数,因为所有满足 nums[i]>9nums[i] > 9nums[i]>9 的数都等于 101010,但是 555 不是 合法 整数。
你可以对 numsnumsnums 执行以下操作:
- 选择一个整数 hhh,它对于 当前 numsnumsnums 中的值是合法的。
- 对于每个下标 iii,如果它满足 nums[i]>hnums[i] > hnums[i]>h,那么将 nums[i]nums[i]nums[i] 变为 hhh。
你的目标是将 numsnumsnums 中的所有元素都变为 kkk,请你返回 最少 操作次数。如果无法将所有元素都变 kkk,那么返回 −1-1−1。
数据约束
- 1≤nums.length≤1001 \le nums.length \le 1001≤nums.length≤100
- 1≤nums[i]≤1001 \le nums[i] \le 1001≤nums[i]≤100
- 1≤k≤1001 \le k \le 1001≤k≤100
解题过程
题目表述很复杂,实际上就是求大于目标值的不同元素种类数量。
需要注意的是,如果出现小于目标值的元素,那么就应当返回 −1-1−1。
具体实现
class Solution {
public int minOperations(int[] nums, int k) {
int[] count = new int[110];
int res = 0;
for (int num : nums) {
if (num < k) {
return -1;
}
if (num > k && ++count[num] == 1) {
res++;
}
}
return res;
}
}