Leetcode 3375. Minimum Operations to Make Array Values Equal to K
Table of Contents
Problem Informations
- Problem Index: 3375
- Problem Link: Minimum Operations to Make Array Values Equal to K
- Topics: Array, Hash Table
Problem Description
You are given an integer array nums and an integer k.
An integer $h$ is called valid if all values in the array that are strictly greater than $h$ are identical.
For example, if $nums = [10, 8, 10, 8]$, a valid integer is $h = 9$ because all $nums[i] > 9$ are equal to 10, but 5 is not a valid integer.
You are allowed to perform the following operation on nums:
- Select an integer $h$ that is valid for the current values in
nums. - For each index $i$ where $nums[i] > h$, set $nums[i]$ to $h$.
Return the minimum number of operations required to make every element in nums equal to k. If it is impossible to make all elements equal to k, return -1.
Example 1:
Input: nums = [5,2,5,4,5], k = 2
Output: 2
Explanation:
The operations can be performed in order using valid integers 4 and then 2.
Example 2:
Input: nums = [2,1,2], k = 2
Output: -1
Explanation:
It is impossible to make all the values equal to 2.
Example 3:
Input: nums = [9,7,5,3], k = 1
Output: 4
Explanation:
The operations can be performed using valid integers in the order 7, 5, 3, and 1.
Constraints:
- $1 \leq nums.length \leq 100 $
- $1 \leq nums[i] \leq 100$
- $1 \leq k \leq 100$
Intuition
The problem aims to transform an array nums into an array where all elements are equal to a given integer k. The transformation is accomplished by allowing us to select a valid integer h iteratively, reducing elements greater than h in nums to the value of h itself. The core challenge is to minimize the number of such operations needed to accomplish this task or to determine that it is impossible if any element in the original array is less than k.
To solve this, the key observation is that any value in nums that is less than k immediately indicates that the transformation is impossible. Beyond this, if all elements are at least k, we can systematically reduce everything above k by iterating through unique values in descending order until every element equals k.
Approach
The solution uses a combination of a set and some simple checks to ensure correctness with minimal operations:
Check for Impossibility:
First, we determine if it is immediately impossible to convert all array elements tok. This happens if the smallest element innumsis less thank. Leveraging themin_elementfunction helps us efficiently find the minimal value, allowing for a quick return of-1if necessary.Utilize a Set for Unique Values:
Using aset, we collect all unique elements innums. Each unique number represents a different potential valid integerhthat can aid in reducing elements tok. Ifnumsmeets the initial condition of all elements being greater than or equal tok, we know the approach can progress.Calculate the Operations:
The task, then, simplifies to determining how many unique values are abovek. The number of such unique values dictates how many operations are needed to reduce the array to allks, as each operation can uniformly lower the largest set of elements not yet reduced tok.Adjustment for Initial Equality with
k:
Finally, consider whether the minimum element is alreadyk. If this is the case, one less transformation is required since the base value ofkis already achieved without needing further reduction operations.
Through these steps, the algorithm efficiently counts the minimal operations required or confirms that transforming the array is unobtainable. This strategic combination of set logic and conditional checks delivers the solution within defined constraints.
Code
C++
class Solution {
public:
int minOperations(vector<int>& nums, int k) {
// Check if there's any element in 'nums' less than 'k'.
// If so, it's impossible to make all elements equal to 'k', return -1.
if (*min_element(nums.begin(), nums.end()) < k) {
return -1;
}
// Create a set to store unique elements in 'nums'.
set<int> uniqueElements;
for (int num : nums) {
uniqueElements.insert(num);
}
// Calculate the number of unique elements above 'k'.
// We need one operation to make elements equal to 'k', if 'k' is not already the minimum.
return uniqueElements.size() - 1 +
(*min_element(nums.begin(), nums.end()) == k ? 0 : 1);
}
};
Python
class Solution:
def minOperations(self, nums: List[int], k: int) -> int:
# Check if there's any element in 'nums' less than 'k'.
# If so, it's impossible to make all elements equal to 'k', return -1.
if min(nums) < k:
return -1
# Create a set to store unique elements in 'nums'.
uniqueElements = set()
for num in nums:
uniqueElements.add(num)
# Calculate the number of unique elements above 'k'.
# We need one operation to make elements equal to 'k', if 'k' is not already the minimum.
return len(uniqueElements) - 1 + (0 if min(nums) == k else 1)
Complexity
Time complexity: $O(n \log n)$
The time complexity is primarily driven by the operations on the set and the
min_elementfunction. Inserting each element into the set takes $O(\log n)$ time for a single element, and it is done for each of the $n$ elements in thenumsarray, so this operation takes $O(n \log n)$ in total. Themin_elementfunction, used twice, has a time complexity of $O(n)$. Therefore, the overall time complexity is $O(n \log n) + O(n)$, which simplifies to $O(n \log n)$.Space complexity: $O(n)$
The space complexity is determined by the space needed for the set
uniqueElements, which can hold up to $n$ unique elements from thenumsarray. Hence, the space complexity is $O(n)$. Note that additional space is used by iterators and return values when performing operations likemin_element, but these are not significant enough to affect the overall space complexity.
Disclaimer: All reference materials on this website are sourced from the internet and are intended for learning purposes only. If you believe any content infringes upon your rights, please contact me at csnote.cc@gmail.com, and I will remove the relevant content promptly.
Feedback Welcome: If you notice any errors or areas for improvement in the articles, I warmly welcome your feedback and corrections. Your input will help this blog provide better learning resources. This is an ongoing process of learning and improvement, and your suggestions are valuable to me. You can reach me at csnote.cc@gmail.com.