Python世界:力扣题解1300,转变数组后最接近目标值的数组和,中等

news2024/11/24 1:12:06

Python世界:力扣题解1300,转变数组后最接近目标值的数组和,中等

    • 任务背景
    • 思路分析
    • 代码实现
    • 测试套件
    • 本文小结

任务背景


问题来自力扣题目1300. Sum of Mutated Array Closest to Target,大意如下:

Given an integer array arr and a target value target, return the integer value such that when we change all the integers larger than value in the given array to be equal to value, the sum of the array gets as close as possible (in absolute difference) to target.

In case of a tie, return the minimum such integer.

Notice that the answer is not neccesarilly a number from arr.

翻译下,转变数组后最接近目标值的数组和,实际需求是:对给定无序数组及目标值,返回一个value值使数组里大于该值的均置换为value,从而使新数组的元素和,最接近target。

思路分析


容易看到该value有个最小和最大值限制,最小值是target/len,最大值是数组的最大元素值max(arr)

题意可以转化为找区间内,最小的value生成sum和,满足条件target的值,而且最小到最大值的sum是升序的。故容易看出,可以用二分法求边界值来处理。

思路如下:

  • 先升序排序arr
  • 遍历不同索引下arr的和数组sum
  • sum结果分类有三种:
    • value在有序数组左边,arr[0]*n > target
    • value在有序数组右边,sum[-1] <= target
    • value在有序数组中间,以上条件以外
  • 前两种条件,可直接返回处理
  • 第三种条件,需用二分法找最小的value
    • 粗搜,先二分找数组元素的边界值
    • 细搜,再二分找数组元素边界值左右侧中间值

代码实现


import numpy as np

class Solution(object):
    def get_adapt_sum(self, arr_sorted, arr_sum, arr_len, mid):
        sum1 = arr_sum[mid]
        sum2 = arr_sorted[mid + 1] * (arr_len - (mid + 1))
        sum_adapt = sum1 + sum2
        return sum_adapt

    def findBestValue(self, arr, target):
        """
        :type arr: List[int]
        :type target: int
        :rtype: int
        """
        arr_sorted = sorted(arr)
        arr_len = len(arr)
        arr_sum = np.zeros(arr_len)

        # print(arr_sorted)

        val_sum = 0
        for i in range(arr_len):
            val_sum += arr_sorted[i]
            arr_sum[i] = val_sum

        # 边界在右侧
        if arr_sum[-1] < target:
            return arr_sorted[-1]

        # 边界在左侧
        if arr_sorted[0]*arr_len > target:
            low = target // arr_len
            high = low + 1
            sum_low = low * arr_len
            sum_high = high * arr_len
            if (abs(sum_low - target)) <= (abs(sum_high - target)):
                return low
            else:
                return high

        # 边界在中间
        # search stage 1, range: [low, high)
        low = 0
        high = arr_len
        while (low < high):
            mid = low + (high - low) // 2
            assert(mid != arr_len)
            sum_adapt = self.get_adapt_sum(arr_sorted, arr_sum, arr_len, mid)
            if (sum_adapt < target):
                low = mid + 1
            else: # sum_adapt >= target
                high = mid

        # search stage 2
        base = arr_sum[high]
        n = arr_len - (high + 1)
        low = arr_sorted[high]
        high = arr_sorted[high + 1]

        while (low < high):
            mid = low + (high - low) // 2
            sum_cur = base + n * mid
            if (sum_cur == target):
                return mid
            elif (sum_cur < target):
                low = mid + 1
            else:
                high = mid
        low = high - 1
        sum_low = base + n * low
        sum_high = base + n * high
        if (abs(sum_low - target)) <= (abs(sum_high - target)):
            return low
        else:
            return high

测试套件


用例设计有玄机,解析后分类如下:

结果在左侧边界

  • ret = 3
  • arr = [4,9,3]
  • target = 10

结果在右侧边界

  • ret = 5
  • arr = [2,3,5]
  • target = 10

结果在左侧外

  • ret = 11361
  • arr = [60864,25176,27249,21296,20204]
  • target = 56803

最后,要注意增补下结果在中间的用例。

单例测试demo:

ret = 3
arr = [4,9,3]
target = 10

ret = 5
arr = [2,3,5]
target = 10

ret = 11361
arr = [60864,25176,27249,21296,20204]
target = 56803

sol = Solution()
res = sol.findBestValue(arr, target)
print(res)

测试套demo:

import unittest


def test_base(self, arr, target, ret):
    sol = Solution()
    res = sol.findBestValue(arr, target)
    self.assertEqual(res, ret)


# 编写测试套
class TestSol(unittest.TestCase):
    def test_special1(self):
        ret = 3
        arr = [4,9,3]
        target = 10
        test_base(self, arr, target, ret)

    def test_special2(self):
        ret = 11361
        arr = [60864,25176,27249,21296,20204]
        target = 56803
        test_base(self, arr, target, ret)

    def test_common1(self):
        ret = 5
        arr = [2,3,5]
        target = 10
        test_base(self, arr, target, ret)

    def test_common2(self):
        ret = 2
        arr = [2,3,5]
        target = 6
        test_base(self, arr, target, ret)

    def test_common3(self):
        ret = 4
        arr = [2,3,5]
        target = 9
        test_base(self, arr, target, ret)


# 测试套版本主调
if __name__ == '__main__':
    print('start!')
    unittest.main() # 启动单元测试
    print('done!')

本文小结


本题的关键在于正确理解题意并转化到二分法的框架里,有序+上下界条件,最后是注意边界条件与目标结果的细节处理,要求的是sum和target之差绝对值最小

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2246339.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI+若依框架项目

基础应用篇 1.若依搭建 技术选型 RuoYi-Vue版本&#xff0c;采用了前后端分离的单体架构设计&#xff1a; 软件环境&#xff1a;JDK、MySQL 、Redis 、Maven、Node 技术选型&#xff1a;Spring Boot、Spring Security、MyBatis、Jwt、V 官方推荐 课程版本 JDK > 1.8 …

RabbitMQ高可用延迟消息惰性队列

目录 生产者确认 消息持久化 消费者确认 TTL延迟队列 TTL延迟消息 惰性队列 生产者确认 生产者确认就是&#xff1a;发送消息的人&#xff0c;要确保消息发送给了消息队列&#xff0c;分别是确保到了交换机&#xff0c;确保到了消息队列这两步。 1、在发送消息服务的ap…

将django+vue项目发布部署到服务器

1.部署django后端服务 部署架构 1.1 下载依赖插件 pip3.8 freeze > requirements.txt1.2 安装依赖插件 pip3 install -r requirements.txt1.3 安装mysql数据库 apt install mysql-server初始化数据库 CREATE USER admin% IDENTIFIED WITH mysql_native_password BY 123…

论文阅读:SIMBA: single-cell embedding along with features

Chen, H., Ryu, J., Vinyard, M.E. et al. SIMBA: single-cell embedding along with features. Nat Methods 21, 1003–1013 (2024). 论文地址&#xff1a;https://doi.org/10.1038/s41592-023-01899-8 代码地址&#xff1a;https://github.com/pinellolab/simba. 摘要 大多…

商业物联网:拥抱生产力的未来

在现代商业格局中&#xff0c;数据占据至高无上的地位。物联网&#xff08;IoT&#xff09;站在这场数字革命的前沿&#xff0c;将以往模糊不清的不确定因素转变为可衡量、可付诸行动的深刻见解。物联网技术为日常物品配备传感器与连接功能&#xff0c;使其能够实时收集并传输数…

【FRP 内网穿透 从0到1 那些注意事项】

【摘要】 最近跟第三方团队调试问题&#xff0c;遇到一个比较烦的操作。就是&#xff0c;你必须要发个版到公网环境&#xff0c;他们才能链接到你的接口地址&#xff0c;才能进行调试。按理说&#xff0c;也没啥&#xff0c;就是费点时间。但是&#xff0c;在调试的时候&#…

最新Kali安装详细版教程(附安装包,傻瓜式安装教程)

本文主要详细介绍 kali 的安装过程&#xff0c;以及安装完成后的基本设置&#xff0c;比如安装增强工具&#xff0c;安装中文输入法以及更新升级等操作。 文章目录 实验环境准备工作步骤说明安装虚拟机安装 Kali安装增强工具安装中文输入法更新升级 实验环境 VMware &#x…

【山大909算法题】2014-T1

文章目录 1.原题2.算法思想3.关键代码4.完整代码5.运行结果 1.原题 为带表头的单链表类Chain编写一个成员函数Reverse&#xff0c;该函数对链表进行逆序操作&#xff08;将链表中的结点按与原序相反的顺序连接&#xff09;&#xff0c;要求逆序操作就地进行&#xff0c;不分配…

论文浅尝 | MindMap:知识图谱提示激发大型语言模型中的思维图(ACL2024)

笔记整理&#xff1a;和东顺&#xff0c;天津大学硕士&#xff0c;研究方向为软件缺陷分析 论文链接&#xff1a;https://aclanthology.org/2024.acl-long.558/ 发表会议&#xff1a;ACL 2024 1. 动机 虽然大语言模型&#xff08;LLMs&#xff09;已经在自然语言理解和生成任务…

Win11 22H2/23H2系统11月可选更新KB5046732发布!

系统之家11月22日报道&#xff0c;微软针对Win11 22H2/23H2版本推送了2024年11月最新可选更新补丁KB5046732&#xff0c;更新后&#xff0c;系统版本号升至22621.4541和22631.4541。本次更新后系统托盘能够显示缩短的日期和时间&#xff0c;文件资源管理器窗口很小时搜索框被切…

SpringSecurity创建一个简单的自定义表单的认证应用

1、SpringSecurity 自定义表单 在 Spring Security 中创建自定义表单认证应用是一个常见的需求&#xff0c;特别是在需要自定义登录页面、认证逻辑或添加额外的表单字段时。以下是一个详细的步骤指南&#xff0c;帮助你创建一个自定义表单认证应用。 2、基于 SpringSecurity 的…

Cloud Native 云原生后端的开发注意事项

在云原生后端开发里&#xff0c;数据管理和存储这块得好好弄。数据库选型得综合考虑&#xff0c;像关系型数据有复杂查询需求就选 MySQL、PostgreSQL&#xff0c;海量非结构化数据就可以考虑 MongoDB、Cassandra 这些。设计数据库得遵循规范化原则&#xff0c;像设计电商订单表…

通达OA前台submenu.php存在SQL注入漏洞(CVE-2024-10600)

通达OA前台submenu.php存在SQL注入漏洞(CVE-2024-10600) pda/appcenter/submenu.php 未包含inc/auth.inc.php且 $appid 参数未用’包裹导致前台SQL注入 影响范围 v2017-v11.6 fofa app"TDXK-通达OA" && icon_hash"-759108386"poc http://url…

TCP连接(三次握手)(四次挥手)

建立TCP连接&#xff08;三次握手&#xff09; 以下是简单阐述 在确定目标服务器 IP 地址后&#xff0c;则经历三次握手建立TCP 连接 三次握手 代表客户端和服务端 之间的传递信息有三次 A说&#xff1a;我想和你聊天 &#xff0c;你能听到我说话吗 B说&#xff1a;我可以听到…

【MySQL实战45讲笔记】基础篇——事务隔离

系列文章 基础篇——MySQL 的基础架构 基础篇——redo log 和 binlog 目录 系列文章1. 事务隔离1.1 隔离性与隔离级别1.2 如何实现事务隔离1.3 事务的启动方式1.4 思考&#xff1a; 使用什么方案来避免长事务 1. 事务隔离 简单来说&#xff0c;事务就是要保证一组数据库操作&…

upload-labs-master第12关详细教程

成功了别忘了回来留下你的评论哦&#xff0c;嘻嘻 目录 环境配置闯关 环境配置 需要的东西 phpstudy-2018 链接&#xff1a; https://pan.baidu.com/s/1D9l13XTQw7o6A8CSJ2ff9Q 提取码&#xff1a;0278 32位 vc9和11运行库 链接&#xff1a; https://pan.baidu.com/s/1pBV3W…

Mac 修改默认jdk版本

当前会话生效 这里演示将 Java 17 版本降低到 Java 8 查看已安装的 Java 版本&#xff1a; 在终端&#xff08;Terminal&#xff09;中运行以下命令&#xff0c;查看已安装的 Java 版本列表 /usr/libexec/java_home -V设置默认 Java 版本&#xff1a; 找到 Java 8 的安装路…

uniapp奇怪bug汇总

H5端请求api文件夹接口报错 踩坑指数&#xff1a;5星 小程序、APP之前都是用api文件夹的接口引用调用&#xff0c;在h5端启动时报错&#xff0c;研究半天&#xff0c;发现把api文件夹名字改成apis就能调用&#xff0c;就像是关键字一样无法使用。 import authApi from /api/…

交换机配置从IP(Switch Configuration from IP)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

大语言模型---ReLU函数的计算过程及其函数介绍

文章目录 1. 概要2. ReLU定义 1. 概要 **ReLU 作用&#xff1a;**主要用于为神经网络引入非线性能力&#xff0c;作用是将输入中的整数保留原值&#xff0c;负数置为 0。 从而在层与层之间引入非线性&#xff0c;使神经网络能够拟合复杂的非线性关系。 **ReLU使用场景&#xf…