LeetCode每日一题,1300. Sum of Mutated Array Closest to Target
先看题目描述
题目大意就是给定一个整数数组 arr 和一个目标值 target ,返回一个整数 value ,使得将数组中所有大于 value 的值变成 value 后,数组的和最接近 target
算法和思路
算法流程qi
先对数组排序并求出数组和,若数组和小于 target,直接返回排序后数组的最后一项
若数组和大于 target,则先令 value = target / len,然后计算得到将数组中所有大于 value 的值变成 value 后,数组和与 target 之差的绝对值 dif,然后执行循环
令 value = value+ 1,prevDif = dif,计算得到将数组中所有大于 value 的值变成 value 后,数组和与 target 之差的绝对值 dif
重复上述步骤直到 prevDif <= dif,退出循环
返回 value - 1
解释:如果我们以 value 为自变量,将数组中所有大于 value 的值变成 value 后数组之和 F(value)看作因变量,那么 F(value) 就是一个关于 value 的函数,再令 G(value) = F(value) - target 的绝对值,经分析后我们可以得出一个结论,F(value) 是关于 value 的单调递增函数,则G(value) 在整数域上是关于 value的先递减再递增函数,因为F(value) 一定是小于等于 value * len 的,故在 [target / len, +∞) 中一定存在一个 value 值,使得 G(value) 取得最小值,因此我们结合 G(value) 的单调性分析可以得到,当 G(value) < G(value + 1)时,这个 value 就是题目要求的值
算法源码
1 | import java.util.Arrays; |