zoukankan      html  css  js  c++  java
  • LeetCode 1300. 转变数组后最接近目标值的数组和 | Python

    1300. 转变数组后最接近目标值的数组和


    题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/sum-of-mutated-array-closest-to-target

    题目


    给你一个整数数组 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

    解题思路


    思路:二分查找

    本题当中,可能比较棘手的是题目中【value 为整数,数组和接近 target】和【答案不一定是 arr 中的数字】。也就是说,题目要我们求的是最接近。

    那么现在的问题就可以转变为去考虑如何去评判接近?下面罗列最接近的可能情况:

    • 选定一个 value,转变之后,数组求和等于 target。(当然,这是最理想的情况)
    • 选定的 value 值过大,接近程度变小;
    • 选定的 value 值过小,接近程度变大。
    • 第二种和第三种情况,反过来可能也能成立。

    这如何去考虑第二种和第三种的情况,本篇幅所从采取的方案是确定上下边界,取可能的 value 值进行比较。

    具体的做法:

    • 先确定一个 value 值,对数组进行转变,求和
    • 如果能使得转变后的数组和是第 1 个大于等于 target 的,那么就确定上下边界
    • 因为 value 是整数,那么最终的答案可能落在 value,也可能是 value - 1

    具体的代码实现如下。

    代码实现


    class Solution:
        def findBestValue(self, arr: List[int], target: int) -> int:
            def cacl_change_sum(arr, value):
                res = 0
                # 大于 value 的值要进行转变
                for num in arr:
                    res += min(num, value)
                
                return res
    
            left = 0
            right = max(arr)
    
            while left < right:
                mid = (left+ right) // 2
                # 计算转化后的数组之和
                res = cacl_change_sum(arr, mid)
                # 查找第一个 value 使得转变的数组和大于等于 target
                if res < target:
                    left = mid + 1
                else:
                    right = mid
    
            
            # 当找到第一个 value 使得转变的数组和大于等于 target 时,答案可能落在 value 或 value - 1
            # 现在,比较两者间的结果,接近程度越小,则是返回结果
            res1 = cacl_change_sum(arr, left)
            res2 = cacl_change_sum(arr, left - 1)
    
            if res1 - target < target - res2:
                return left
            return left - 1
    

    实现结果


    实现结果

    总结


    • 先理清题意,由于有【value 为整数,数组和接近 target】和【答案不一定是 arr 中的数字】的要求,所以题目可以从考虑如何去求最接近的方案出发;
    • 本篇幅使用的二分查找,具体的做法:
      • 先确定一个 value 值,对数组进行转变求和
      • 如果此时的数组和是第一个大于等于 target 值,那么此时可以确定上下边界
      • 由于 value 必须是整数,那么答案就可能落在 value 或 value - 1 上。

    文章原创,如果觉得写得好,欢迎关注点赞。微信公众号《书所集录》同步更新,同样欢迎关注点赞。

  • 相关阅读:
    MySQL批量UPDATE多行记录
    qt 标准对话框
    qt creator 源代码中含有中文编译报错
    qt编译mysql插件
    win7自动登录桌面
    编译QtAV工程库
    Qt Creator 中关于调试器的设置
    QtCreator 添加第三方头文件库文件路径
    Qt 安装一个Service
    Qt 添加启动项
  • 原文地址:https://www.cnblogs.com/yiluolion/p/13135765.html
Copyright © 2011-2022 走看看