题目描述:
给你一个整数数组 arr 和一个目标值 target ,请你返回一个整数 value ,使得将数组中全部大于 value 的值变成 value 后,数组的和最接近 target (最接近表示二者之差的绝对值最小)。
若是有多种使得和最接近 target 的方案,请你返回这些整数中的最小值。
请注意,答案不必定是 arr 中的数字。数组
提示中给的是二分法,而二分法官方解答已经很详细了,下面是个人解体思路函数
首先,这道题的根本目的是在数组中切一刀。那么具体在哪切一刀呢?rest
根据题意咱们能够肯定value的最小值是1,最大值能够取到arr数组的最大值。那么最暴力的方法固然是直接再value的取值范围里采用循环遍历,找出value的值。固然,这样作的时间成本太大了,力扣是不会给你分的(我已经试过了)。blog
为了清晰的描述个人思路,这里先举个栗子。get
为了方便,我这里直接给出一个已经排列好的数组。(数组的排列能够直接使用sort()函数)io
arr[]={7,9,12,17,19,25} target=80class
这里的数组大小是6,要让它的和接近80,那么也就是说这6个数的平均值要接近13.33(80/6),也就是说,此数组不可能在12的前面切一刀循环
若在12后面17前面切一刀,新数组arr[7,9,12,x,x,x],为了使数组和更接近target:遍历
那么 80-7-9-12=52 x=52/3=17.33<17.5,方法
因此X最合适的值就是17,即value=17
代码以下:
若是有什么问题,欢迎你们指正!