LeetCode 3375.使数组的值全部为 K 的最少操作次数:O(1)空间——排序+一次遍历
【LetMeFly】3375.使数组的值全部为 K 的最少操作次数:O(1)空间——排序+一次遍历
力扣题目链接:https://leetcode.cn/problems/minimum-operations-to-make-array-values-equal-to-k/
给你一个整数数组 nums
和一个整数 k
。
如果一个数组中所有 严格大于 h
的整数值都 相等 ,那么我们称整数 h
是 合法的 。
比方说,如果 nums = [10, 8, 10, 8]
,那么 h = 9
是一个 合法 整数,因为所有满足 nums[i] > 9
的数都等于 10 ,但是 5 不是 合法 整数。
你可以对 nums
执行以下操作:
- 选择一个整数
h
,它对于 当前nums
中的值是合法的。 - 对于每个下标
i
,如果它满足nums[i] > h
,那么将nums[i]
变为h
。
你的目标是将 nums
中的所有元素都变为 k
,请你返回 最少 操作次数。如果无法将所有元素都变 k
,那么返回 -1 。
示例 1:
输入:nums = [5,2,5,4,5], k = 2
输出:2
解释:
依次选择合法整数 4 和 2 ,将数组全部变为 2 。
示例 2:
输入:nums = [2,1,2], k = 2
输出:-1
解释:
没法将所有值变为 2 。
示例 3:
输入:nums = [9,7,5,3], k = 1
输出:4
解释:
依次选择合法整数 7 ,5 ,3 和 1 ,将数组全部变为 1 。
提示:
1 <= nums.length <= 100
1 <= nums[i] <= 100
1 <= k <= 100
解题方法:排序+遍历
这是一道阅读理解题。
先将数组从大到小排个序,若最小值小于 k k k则直接返回 − 1 -1 −1,否则继续。
从(第二个元素开始)前到后遍历数组,若当前元素与上一个元素不同,则需要将上一个元素(和所有与之相等的元素)经过一次操作变成当前元素,操作次数加一。
最终(遍历完成后),数组中所有值都会变成 k k k。如果最小值不是 k k k,则还需要额外的一次变换将所有值都变成 k k k。
- 时间复杂度 O ( n log n ) O(n\log n) O(nlogn),其中 n = l e n ( n u m s ) n=len(nums) n=len(nums)
- 空间复杂度 O ( 1 ) O(1) O(1)
AC代码
C++
/*
* @Author: LetMeFly
* @Date: 2025-04-09 21:58:45
* @LastEditors: LetMeFly.xyz
* @LastEditTime: 2025-04-09 22:08:39
*/
#if defined(_WIN32) || defined(__APPLE__)
#include "_[1,2]toVector.h"
#endif
class Solution {
public:
int minOperations(vector<int>& nums, int k) {
sort(nums.begin(), nums.end(), greater<int>());
if (nums.back() < k) {
return -1;
}
int ans = 0;
for (int i = 1; i < nums.size(); i++) {
if (nums[i] != nums[i - 1]) {
printf("nums[%d] = %d, nums[%d] = %d, ans = %d, ans++\n", i, nums[i], i - 1, nums[i - 1], ans); // ****
ans++;
}
}
return ans + (nums.back() != k);
}
};
Python
'''
Author: LetMeFly
Date: 2025-04-09 22:09:48
LastEditors: LetMeFly.xyz
LastEditTime: 2025-04-09 22:10:06
'''
from typing import List
class Solution:
def minOperations(self, nums: List[int], k: int) -> int:
nums.sort(reverse=True)
if nums[-1] < k:
return -1
ans = 0
for i in range(1, len(nums)):
if nums[i] != nums[i - 1]:
ans += 1
return ans + (nums[-1] != k)
Java
/*
* @Author: LetMeFly
* @Date: 2025-04-09 22:12:36
* @LastEditors: LetMeFly.xyz
* @LastEditTime: 2025-04-09 22:15:42
*/
import java.util.Arrays;
class Solution {
public int minOperations(int[] nums, int k) {
Arrays.sort(nums);
if (nums[0] < k) {
return -1;
}
int ans = 0;
for (int i = nums.length - 1; i > 0; i--) {
if (nums[i] != nums[i - 1]) {
ans++;
}
}
if (nums[0] != k) {
ans++;
}
return ans;
}
}
Go
/*
* @Author: LetMeFly
* @Date: 2025-04-09 22:16:49
* @LastEditors: LetMeFly.xyz
* @LastEditTime: 2025-04-09 22:18:14
*/
package main
import "slices"
func minOperations(nums []int, k int) (ans int) {
slices.Sort(nums)
if nums[0] < k {
return -1
}
for i := len(nums) - 1; i > 0; i-- {
if nums[i] != nums[i - 1] {
ans++
}
}
if nums[0] != k {
ans++
}
return
}
同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
千篇源码题解已开源