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 in nums. If there are multiple occurrences of the minimum value, select the one that appears first.
  • Replace the selected minimum value x with x * 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;
    }
    
    

All Problems

All Solutions