阿里笔试模拟题-110.数组变换

概述:
给出一个长度为 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版权协议,转载请附上原文出处链接和本声明。