LeetCode 刷题之旅(2020.06.14)——1300. 转变数组后最接近目标值的数组和(中)

LeetCode 刷题之旅(2020.06.14)——1300. 转变数组后最接近目标值的数组和(中)

题目:

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

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

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

示例 1:

输入:arr = [4,9,3], target = 10
输出:3
解释:当选择 value 为 3 时,数组会变成 [3, 3, 3],和为 9 ,这是最接近 target 的方案。

示例 2:

输入:arr = [2,3,5], target = 10
输出:5

示例 3:

输入:arr = [60864,25176,27249,21296,20204], target = 56803
输出:11361

提示:

1 <= arr.length <= 10^4
1 <= arr[i], target <= 10^5

解题模板:
Python 3:

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

解题思路:

  • 迭代法:

首先,将数组从小到大排序。然后,比较数组中的元素和对于 target 来说的平均数 avg(avg = target / len(arr) )的大小,小于平均数 avg 的元素进行删除,依次迭代,直到数组中没有小于avg的数或数组空了为止。最后,计算此时从 avg 到 arr[0] 中满足要求的最小整数即可。当然如果此时 arr 为空,那说明最初的数组全部元素之和也不够 target,因此返回最后一次迭代时删除的元素即可,即原始数组的最大值。

解法:

class Solution:
    def find_(self, nums, avg):
        result = []
        sum_ = 0
        for i in nums:
            if i >= avg:
                result.append(i)
            else:
                sum_ += i
        return result, sum_, False if nums[0] < avg else True

    def findBestValue(self, arr: List[int], target: int) -> int:
        arr.sort()
        sign = False
        sum_ = 0
        while not sign:
            if not arr:
                return sum_
            avg = target / len(arr)
            arr, sum_, sign = self.find_(arr, avg)
            target -= sum_

        max_distance = target - sum_
        result = target // len(arr)
        for i in range(target // len(arr), arr[0]):
            distance = target - len(arr) * i if target - len(arr) * i >= 0 else len(arr) * i - target
            if distance < max_distance:
                max_distance = distance
                result = i
        return result

时间复杂度O( N * log N )
空间复杂度O( 1 )

你可能感兴趣的:(LeetCode每日一题,leetcode,python,算法)