概述:
给出一个长度为 n 的数组,和一个正整数 d。
你每次可以选择其中任意一个元素 a[i] 将其变为 a[i] + d 或 a[i] - d,这算作一次操作。你需要将所有的元素全部变成相等元素,如果有解,请输出最小操作次数,如果无解请输出-1。
输入数字n、数字d,和一个长度为n的数组a。1 <= n <= 100000,1 <= d <= 100, 1 <= a[i] <= 100000。
输出一个数字,表示最小的操作次数,如果无解输出-1。
题目地址
110.数组变换
题目解题方法有文档解释,文档下载地址为以下
程序员面试宝典
但是官方只有解题思路,没有具体代码,所以这边我就附上我的解题代码,具体思路可以参照上面的解释,不一定完全一样,但是相似。
public int solution(int n, int d, int[] a) {
Arrays.sort(a);
int r = a[0]%d;
int[] left = new int[n];
left[0] = 0;
for(int i = 1;i<n;i++){
if((a[i]%d) != r){
return -1;
}
left[i] = left[i-1] + a[i-1];
}
int[] right = new int[n];
right[n-1] = 0;
for(int i = n-2;i>=0;i--){
right[i] = right[i+1] + a[i+1];
}
int[] m = new int[n];
int res = Integer.MAX_VALUE;
for(int i=0;i<n;i++){
m[i] += (i * a[i] - left[i])/d;
m[i] += (right[i] - (n-1-i) * a[i])/d;
res = Math.min(res, m[i]);
}
return res;
}
版权声明:本文为dogHuaMing原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。