Welcome to Subscribe On Youtube
3264. Final Array State After K Multiplication Operations I
Description
You are given an integer array nums
, an integer k
, and an integer multiplier
.
You need to perform k
operations on nums
. In each operation:
- Find the minimum value
x
innums
. If there are multiple occurrences of the minimum value, select the one that appears first. - Replace the selected minimum value
x
withx * multiplier
.
Return an integer array denoting the final state of nums
after performing all k
operations.
Example 1:
Input: nums = [2,1,3,5,6], k = 5, multiplier = 2
Output: [8,4,6,5,6]
Explanation:
Operation | Result |
---|---|
After operation 1 | [2, 2, 3, 5, 6] |
After operation 2 | [4, 2, 3, 5, 6] |
After operation 3 | [4, 4, 3, 5, 6] |
After operation 4 | [4, 4, 6, 5, 6] |
After operation 5 | [8, 4, 6, 5, 6] |
Example 2:
Input: nums = [1,2], k = 3, multiplier = 4
Output: [16,8]
Explanation:
Operation | Result |
---|---|
After operation 1 | [4, 2] |
After operation 2 | [4, 8] |
After operation 3 | [16, 8] |
Constraints:
1 <= nums.length <= 100
1 <= nums[i] <= 100
1 <= k <= 10
1 <= multiplier <= 5
Solutions
Solution 1: Priority Queue (Min-Heap) + Simulation
We can use a min-heap to maintain the elements in the array $\textit{nums}$. Each time, we extract the minimum value from the min-heap, multiply it by $\textit{multiplier}$, and then put it back into the min-heap. During the implementation, we insert the indices of the elements into the min-heap and define a custom comparator function to sort the min-heap based on the values of the elements in $\textit{nums}$ as the primary key and the indices as the secondary key.
Finally, we return the array $\textit{nums}$.
The time complexity is $O((n + k) \times \log n)$, and the space complexity is $O(n)$. Here, $n$ is the length of the array $\textit{nums}$.
-
class Solution { public int[] getFinalState(int[] nums, int k, int multiplier) { PriorityQueue<Integer> pq = new PriorityQueue<>((i, j) -> nums[i] - nums[j] == 0 ? i - j : nums[i] - nums[j]); for (int i = 0; i < nums.length; i++) { pq.offer(i); } while (k-- > 0) { int i = pq.poll(); nums[i] *= multiplier; pq.offer(i); } return nums; } }
-
class Solution { public: vector<int> getFinalState(vector<int>& nums, int k, int multiplier) { auto cmp = [&nums](int i, int j) { return nums[i] == nums[j] ? i > j : nums[i] > nums[j]; }; priority_queue<int, vector<int>, decltype(cmp)> pq(cmp); for (int i = 0; i < nums.size(); ++i) { pq.push(i); } while (k--) { int i = pq.top(); pq.pop(); nums[i] *= multiplier; pq.push(i); } return nums; } };
-
class Solution: def getFinalState(self, nums: List[int], k: int, multiplier: int) -> List[int]: pq = [(x, i) for i, x in enumerate(nums)] heapify(pq) for _ in range(k): _, i = heappop(pq) nums[i] *= multiplier heappush(pq, (nums[i], i)) return nums
-
func getFinalState(nums []int, k int, multiplier int) []int { h := &hp{nums: nums} for i := range nums { heap.Push(h, i) } for k > 0 { i := heap.Pop(h).(int) nums[i] *= multiplier heap.Push(h, i) k-- } return nums } type hp struct { sort.IntSlice nums []int } func (h *hp) Less(i, j int) bool { if h.nums[h.IntSlice[i]] == h.nums[h.IntSlice[j]] { return h.IntSlice[i] < h.IntSlice[j] } return h.nums[h.IntSlice[i]] < h.nums[h.IntSlice[j]] } func (h *hp) Pop() any { old := h.IntSlice n := len(old) x := old[n-1] h.IntSlice = old[:n-1] return x } func (h *hp) Push(x any) { h.IntSlice = append(h.IntSlice, x.(int)) }
-
function getFinalState(nums: number[], k: number, multiplier: number): number[] { const pq = new PriorityQueue({ compare: (i, j) => (nums[i] === nums[j] ? i - j : nums[i] - nums[j]), }); for (let i = 0; i < nums.length; ++i) { pq.enqueue(i); } while (k--) { const i = pq.dequeue()!; nums[i] *= multiplier; pq.enqueue(i); } return nums; }