Given an integer array nums
of size n
, return the minimum number of moves required to make all array elements equal.
In one move, you can increment n - 1
elements of the array by 1
.
Problem Statement
Minimum Moves to Equal Array Elements
Example 1:
Input: nums = [1,2,3] Output: 3 Explanation: [1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]
Minimum number of moves to equal array elements solution
Approach
The idea is to understand that increasing all array elements by 1 except one element is same as decreasing only one element by 1 to equalise all elements.
Consider above example:
nums = [1, 2, 3] 1. [1, 2-1, 3] = [1, 1, 3] 2. [1, 1, 3-1] = [1, 1, 2] 3. [1, 1, 2-1] = [1, 1, 1] Hence, 3 moves
Now this could also be stated as follows:
moves = 3-1 + 2-1 + 1-1 [Hence moves = Difference between each element of array and minimum number in array] = 3 + 2 + 1 - 1 - 1 - 1 = Sum[nums] - Size[nums] * Minimum[nums]
Time complexity: O(n), n is the number of elements in array.
Code Implementation
//
// main.cpp
// Number of moves
//
// Created by Himanshu on 19/09/21.
//
#include <iostream>
#include <vector>
using namespace std;
#define MAX 100
int solve (vector<int> nums) {
int sum = 0, minElement = INT_MAX, n = (int) nums.size();
for (int i=0; i<n; i++) {
minElement = min(minElement, nums[i]);
sum += nums[i];
}
return (sum - (n*minElement));
}
int main(int argc, const char * argv[]) {
vector<int> nums = {1, 2, 3};
printf("Number of moves to equalise array elements: %d\n", solve( nums));
return 0;
}
Output
Number of moves to equalise array elements: 3
Here’s a working example: Ideone