给定数组arr,数组中共有n个数字,每次对其中n-1个任意数字加上1或2或5,最少需要相加多少次后才能保证数组中的数字全部相同

//思路:

// 1,数组排序后

// 2,arr[0]最小,arr[n-1]最大,arr[n-1]与arr[0]相差为x,然后将数组中最大值以外的数字全部加上x,此时arr[0]=arr[n-1],最大值变为arr[n-2]

// 3,重复第二步操作后,arr[0]=arr[n-1]==arr[n-2],最大值变为arr[n-2]

// 4,重复n次第二步操作后,arr数组中所有数字相同

// 5.然后将每次的差值x对应的计算次数合计后即为所需计算次数

//优化:回顾上述步骤后发现,x的值依次为a[n-1]-a[0],a[n-2]-a[0]......an[0]-a[0],因此该问题可简化为数组中所有数字减去最小值后的数组,此时我们发现排序失去了意义,只要找到数组中的最小值即可

//注意:对于1,5,5的组合

// 按照上述方法计算过程为,加4后获得5,9,5,再加4后获得9,9,9,一次加4需要两次加2实现,因此共需4步,

// 但该组合存在更优解法,加5后获得6,10,5,再加5后获得11,10,10,再加1后获得11,11,11,只需3步

static int equal(int[] arr) {

int min = Arrays.stream(arr)

.min().getAsInt();

    long sum = Long.MAX_VALUE;

    for (int base =0; base <3; base++) {

int finalBase = base;

        int totalTimes = Arrays.stream(arr)

.map(i -> i -min +finalBase)

.map(Solution::getTimes)

.sum();

        sum = Math.min(totalTimes, sum);

    }

return (int) sum;

}

//判断一个数字需要5,2,1多少次相加才能获得

static int getTimes(int diff) {

int times =0;

    if (diff >=5) {

times += diff /5;

        diff = diff %5;

    }

if (diff >=2) {

times += diff /2;

        diff = diff %2;

    }

if (diff >=1) {

times += diff /1;

    }

return times;

}

你可能感兴趣的:(给定数组arr,数组中共有n个数字,每次对其中n-1个任意数字加上1或2或5,最少需要相加多少次后才能保证数组中的数字全部相同)