【力扣】1300:转变数组后最接近目标值的数组和

算法思路

给你一个整数数组 arr 和一个目标值 target ,请你返回一个整数 value ,使得将数组中所有大于 value 的值变成 value 后,数组的和最接近 target (最接近表示两者之差的绝对值最小)。

如果有多种使得和最接近 target 的方案,请你返回这些整数中的最小值。

请注意,答案不一定是 arr 中的数字。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-of-mutated-array-closest-to-target
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

算法思路

class Solution:
    def findBestValue(self, arr: List[int], target: int) -> int:
        arr.sort()
        return self.hel(arr,target)

    def hel(self,arr,target):
        n=len(arr)
        z=target/n
        if z==arr[0]:return arr[0]
        elif z<arr[0]:
            if z-int(z)>0.5:
                return int(z)+1
            else:
                return int(z)
        elif z>arr[0]:
            i=0
            while z>arr[i]:
                target-=arr[i]
                n-=1
                if n==0:return arr[-1]
                z=target/n
                i+=1
            # if n==1:return arr[-1]
            return self.hel(arr[i:],target)

执行用时 :44 ms, 在所有 Python3 提交中击败了98.92%的用户
内存消耗 :15 MB, 在所有 Python3 提交中击败了25.00%的用户

class Solution:
    def findBestValue(self, arr: List[int], target: int) -> int:
        arr.sort()
        self.arr=arr
        return self.hel(0,len(arr),target)

    def hel(self,i,n,target):
        z=target/n
        if z==self.arr[i]:return self.arr[i]
        elif z<self.arr[i]:
            if z-int(z)>0.5:
                return int(z)+1
            else:
                return int(z)
        elif z>self.arr[i]:
            while z>self.arr[i]:
                target-=self.arr[i]
                n-=1
                if n==0:return self.arr[-1]
                z=target/n
                i+=1
            # if n==1:return arr[-1]
            return self.hel(i,n,target)

执行用时 :40 ms, 在所有 Python3 提交中击败了99.46%的用户
内存消耗 :14.8 MB, 在所有 Python3 提交中击败了25.00%的用户

你可能感兴趣的:(力扣日记)