【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$则直接返回$-1$,否则继续。
从(第二个元素开始)前到后遍历数组,若当前元素与上一个元素不同,则需要将上一个元素(和所有与之相等的元素)经过一次操作变成当前元素,操作次数加一。
最终(遍历完成后),数组中所有值都会变成$k$。如果最小值不是$k$,则还需要额外的一次变换将所有值都变成$k$。
时间复杂度$O(n\log n)$,其中$n=len(nums)$
空间复杂度$O(1)$
AC代码 C++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #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 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ''' 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 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 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 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 package mainimport "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 和我的个人博客 ,原创不易,转载经作者同意后请附上原文链接 哦~
千篇源码题解已开源