462. Minimum Moves to Equal Array Elements II
leetcode medium
Task
Дан массив целых чисел nums размера n, вернуть минимальное количество ходов, необходимых для того, чтобы сделать все элементы массива равными.
В одном ходе вы можете увеличить или уменьшить элемент массива на 1.
Тестовые случаи составлены так, что ответ поместится в 32-битное целое число.
Пример:
Input: nums = [1,2,3]
Output: 2
Explanation:
Only two moves are needed (remember each move increments or decrements one element):
[1,2,3] => [2,2,3] => [2,2,2]
C# solution
matched/originalpublic class Solution {
public int MinMoves2(int[] nums) {
long ans = long.MaxValue;
int minval = int.MaxValue;
int maxval = int.MinValue;
foreach (int num in nums) {
minval = Math.Min(minval, num);
maxval = Math.Max(maxval, num);
}
for (int i = minval; i <= maxval; i++) {
long sum = 0;
foreach (int num in nums) {
sum += Math.Abs(num - i);
}
ans = Math.Min(ans, sum);
}
return (int) ans;
}
}C++ solution
auto-draft, review before submit#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public int MinMoves2(vector<int>& nums) {
long ans = long.MaxValue;
int minval = int.MaxValue;
int maxval = int.MinValue;
foreach (int num in nums) {
minval = min(minval, num);
maxval = max(maxval, num);
}
for (int i = minval; i <= maxval; i++) {
long sum = 0;
foreach (int num in nums) {
sum += abs(num - i);
}
ans = min(ans, sum);
}
return (int) ans;
}
}Java solution
matched/originalpublic class Solution {
public int minMoves2(int[] nums) {
long ans = Long.MAX_VALUE;
int minval = Integer.MAX_VALUE;
int maxval = Integer.MIN_VALUE;
for (int num : nums) {
minval = Math.min(minval, num);
maxval = Math.max(maxval, num);
}
for (int i = minval; i <= maxval; i++) {
long sum = 0;
for (int num : nums) {
sum += Math.abs(num - i);
}
ans = Math.min(ans, sum);
}
return (int) ans;
}
}JavaScript solution
matched/originalclass Solution {
minMoves2(nums) {
let ans = Number.MAX_SAFE_INTEGER;
let minval = Math.min(...nums);
let maxval = Math.max(...nums);
for (let i = minval; i <= maxval; i++) {
let sum = 0;
for (let num of nums) {
sum += Math.abs(num - i);
}
ans = Math.min(ans, sum);
}
return ans;
}
}Python solution
matched/originalclass Solution:
def minMoves2(self, nums: List[int]) -> int:
ans = float('inf')
minval = min(nums)
maxval = max(nums)
for i in range(minval, maxval + 1):
sum_moves = 0
for num in nums:
sum_moves += abs(num - i)
ans = min(ans, sum_moves)
return int(ans)Go solution
matched/originalpackage main
import (
"math"
"sort"
)
func minMoves2(nums []int) int {
ans := math.MaxInt64
minval, maxval := nums[0], nums[0]
for _, num := range nums {
if num < minval {
minval = num
}
if num > maxval {
maxval = num
}
}
for i := minval; i <= maxval; i++ {
sum := 0
for _, num := range nums {
sum += int(math.Abs(float64(num - i)))
}
if sum < ans {
ans = sum
}
}
return ans
}Explanation
Algorithm
Найти минимальный и максимальный элементы в массиве. Пусть k будет числом, к которому должны быть приведены все элементы массива.
Перебирать значения k в диапазоне между минимальным и максимальным элементами, вычисляя количество ходов, необходимых для каждого k.
Определить минимальное количество ходов среди всех возможных k, что и будет конечным результатом.
😎