Python算法题集_和为K的子数组

news2024/12/28 4:06:29

本文为Python算法题集之一的代码示例

题目560:和为K的子数组

说明:给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数

子数组是数组中元素的连续非空序列。

示例 1:

输入:nums = [1,1,1], k = 2
输出:2

示例 2:

输入:nums = [1,2,3], k = 3
输出:2

提示:

  • 1 <= nums.length <= 2 * 104
  • -1000 <= nums[i] <= 1000
  • -107 <= k <= 107

- 问题分析

  1. 本题为求子数组和为K,子数组为非空的连续元素

  2. 主要的计算为两个,1是元素求和,而是比较和与K

  3. 基本的遍历为双层循环,从第一个元素开始,计算从此元素开始有多少次和为K,所以基本的时间算法复杂度为(On2)

- 优化思路

  1. 优化的思路,一是减少计算次数,二是减少检索次数和提升检索效率

  2. 标准的优化思路,前缀和【从第1个元素累加到第n个元素的和,称为第n个前缀和】,只要出现2个前缀和的差=k,则这两个下标之间的数组即满足要求

  3. 进一步优化,第n个元素前缀和为isum_n,则1至n-1如果有x个前缀和为k-isum_n,则第n个元素可以在1至n-1之间形成x个和为k的子数组

  4. 以上优化都是考虑前缀和差,因此对于nums只有一个元素的情况要单独进行处理


  1. 标准版【双循环】,毫无疑问,直接超时

    注意:

    • CheckFuncPerf是我写的函数用时和内存占用模块,地址在这里:测量函数运行用时、内存占用的代码单元CheckFuncPerf.py以及使用方法
    • 测试的超长nums文件是官网的,已经上传到CSDN,地址在这里:和为K的子数组测试用超长数组
    import CheckFuncPerf as cfp
    
    def subarraySum_base(nums, k):
        result=0
        for iIdx in range(len(nums)):
            iSum = nums[iIdx]
            if iSum == k:
                result += 1
            for jIdx in range(iIdx+1, len(nums)):
                iSum += nums[jIdx]
                if iSum == k:
                    result += 1
        return result
    
    testcase_big1 = open(r'testcase/hot10_big1.txt', mode='r', encoding='utf-8').read().replace('[', '').replace(']', '')
    testcase_big1 = testcase_big1.split(',')
    nums = [int(x) for x in testcase_big1]
    k = 714
    
    result = cfp.getTimeMemoryStr(subarraySum_base, nums, k)
    print(result['msg'], '执行结果 = {}'.format(result['result']))
    # 运行结果
    函数 subarraySum_base 的运行时间为 10591.62 ms;内存使用量为 4.00 KB 执行结果 = 40
    
  2. 优化版【提前计算前缀和,直接计算前缀和之差】,有想法,然并卵,超时依旧

    import CheckFuncPerf as cfp
    
    def subarraySum_ext1(nums, k):
        if len(nums)==1:
            if nums[0] == k:
                return 1
            else:
                return 0
        isumpref=[0] * len(nums)
        iSum = 0
        for iIdx in range(len(nums)):
            iSum += nums[iIdx]
            isumpref[iIdx] = iSum
        result=0
        for iIdx in range(len(nums)):
            if iIdx==0 and nums[iIdx] == k:
                result += 1
            if isumpref[iIdx] == k:
                result += 1
            for jIdx in range(iIdx+1, len(nums)):
                if isumpref[jIdx]-isumpref[iIdx] == k:
                    result += 1
        return result
    
    testcase_big1 = open(r'testcase/hot10_big1.txt', mode='r', encoding='utf-8').read().replace('[', '').replace(']', '')
    testcase_big1 = testcase_big1.split(',')
    nums = [int(x) for x in testcase_big1]
    k = 714
    
    result = cfp.getTimeMemoryStr(subarraySum_ext1, nums, k)
    print(result['msg'], '执行结果 = {}'.format(result['result']))
    # 运行结果
    函数 subarraySum_ext1 的运行时间为 10508.87 ms;内存使用量为 732.00 KB 执行结果 = 40
    
  3. 优化改进版【单层循环,将到第n个元素的所有前缀和的计数存入字典】,优化所见略同,仅超越68%在这里插入图片描述

    import CheckFuncPerf as cfp
    
    def subarraySum_ext2(nums, k):
        dictsumpref = {}
        isum, iresult = 0, 0
        for num in nums:
            isum += num
            if isum == k:
                iresult += 1
            if isum - k in dictsumpref:
                iresult += dictsumpref[isum - k]
            dictsumpref[isum] = dictsumpref.get(isum, 0) + 1
        return iresult
    
    testcase_big1 = open(r'testcase/hot10_big1.txt', mode='r', encoding='utf-8').read().replace('[', '').replace(']', '')
    testcase_big1 = testcase_big1.split(',')
    nums = [int(x) for x in testcase_big1]
    k = 714
    
    result = cfp.getTimeMemoryStr(subarraySum_ext2, nums, k)
    print(result['msg'], '执行结果 = {}'.format(result['result']))
    # 运行结果
    函数 subarraySum_ext2 的运行时间为 3.99 ms;内存使用量为 160.00 KB 执行结果 = 40
    

    一日练,一日功,一日不练十日空

    may the odds be ever in your favor ~

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

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

相关文章

【idea插件开发】idea插件访问浏览器web地址

背景 以往在eclipse上面开发插件&#xff0c;有兴致想尝试Idea上玩一下插件开发。想要在idea上面访问web地址 概要 记录在idea上面访问web地址 正文 1、点击File->New->Project… 选择IntelliJ Platform Plugin 2、点击下一步后&#xff0c;输入Project Name&#…

(M)unity受伤反弹以及死亡动画

受伤反弹 1.在人物控制脚本中添加受伤后速度将为0&#xff0c;并添加一个反弹的力 在刷新移动时&#xff0c;需要在没有受伤的状态 public bool isHurt; public float hurtForce; private void FixedUpdate() {if(!isHurt)Move(); }public void GetHurt(Transform attacker) …

数据结构·单链表经典例题

1. 移除链表元素 OJ链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 本题是说给出一个链表的头节点head和一个整数val&#xff0c;如果发现节点中存的数据有val就删掉它&#xff0c;最后返回修改后的链表头节点地址 如果题目中没有明确…

【LeetCode每日一题】56. 合并区间插入区间

一、判断区间是否重叠 力扣 252. 会议室 给定一个会议时间安排的数组 intervals &#xff0c;每个会议时间都会包括开始和结束的时间 intervals[i] [starti, endi] &#xff0c;请你判断一个人是否能够参加这里面的全部会议。 思路分析 因为一个人在同一时刻只能参加一个会…

掌握使用 React 和 Ant Design 的个人博客艺术之美

文章目录 前言在React的海洋中起航安装 Create React App安装Ant Design 打造个性化的博客风格通过路由实现多页面美化与样式定制部署与分享总结 前言 在当今数字时代&#xff0c;个人博客成为表达观点、分享经验和展示技能的独特平台。在这个互联网浪潮中&#xff0c;选择使用…

Unity 外观模式(实例详解)

文章目录 示例1&#xff1a;初始化游戏场景中的多个子系统示例2&#xff1a;管理音频播放示例3&#xff1a;场景加载流程示例4&#xff1a;UI管理器示例5&#xff1a;网络服务通信 在Unity中使用外观模式&#xff08;Facade&#xff09;时&#xff0c;主要目的是为了简化复杂子…

如何配置MacLinuxWindows环境变量

这里写目录标题 什么是环境变量什么是PATH为什么要配置环境变量 如何配置环境变量环境变量有哪些环境变量加载顺序环境变量加载详解 配置参考方法一&#xff1a; export PATHLinux环境变量配置方法二&#xff1a;vim ~/.bashrcLinux环境变量配置方法三&#xff1a;vim ~/.bash_…

使用程序设计流程图解析并建立神经网络(不依赖深度学习library)

介绍&#xff1a; ## Flow chart for a simple neural network: #(1)Take inputs 输入 #(2)Add bias (if required) #(3)Assign random weights to input features 随机一个权重 #(4)Run the code for training. 训练集训练 #(5)Find the error in prediction. 找预测损失 #(6…

RAG应用-七个最常见的故障点

近日&#xff0c;国外研究者发布了一篇论文《Seven Failure Points When Engineering a Retrieval Augmented Generation System》&#xff0c;探讨了在实际工程落地RAG应用过程中容易出的七类问题。 论文地址&#xff1a;https://arxiv.org/pdf/2401.05856.pdf 一、丢失内容&…

网络协议与攻击模拟_10DHCP攻击与DHCP欺骗

一、DHCP的报文格式 Message type&#xff1a;消息类型&#xff08;1表示请求&#xff0c;2表示响应&#xff09;Hardware type&#xff1a;硬件类型Hardware address length&#xff1a;硬件地址长度Hops&#xff1a;DHCP报文经过中继的数目。Transaction ID&#xff1a;事务…

树莓派部署Nginx服务结合内网穿透实现远程访问本地站点

文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 安装 Nginx&#xff08;发音为“engine-x”&#xff09;可以将您的树莓派变成一个强大的 Web 服务器&#xff0c;可以用于托管网站或 Web 应用程序。相比其他 Web 服务器&#xff0c;Ngi…

springboot mongodb简单教程

&#xff08;1&#xff09;依赖 compile(org.springframework.boot:spring-boot-starter-data-mongodb) &#xff08;2&#xff09;application.properties配置文件 spring.data.mongodb.host127.0.0.1 spring.data.mongodb.port27017 spring.data.mongodb.databasetest &a…

如何成为一个更好的沟通者?

新年伊始&#xff0c;我想跟大家分享9条我给自己定下的「沟通准则」。 这9条准则&#xff0c;是我对自己的要求&#xff0c;也是我身体力行践行了许多年的做法。我可能也没能践行得非常完美&#xff0c;但这也是我一直在努力的目标。 如果你希望能够跟别人「好好说话」&#xf…

Linux——磁盘和文件系统(一)

Linux——磁盘和文件系统 磁盘机械式磁盘固态硬盘 机械式磁盘结构磁盘&#xff0c;磁道&#xff0c;扇区柱面 文件系统的初始化划卷&#xff08;划盘&#xff09; 挂载C盘放了什么东西Boot Block&#xff08;启动模块&#xff09; 0号组放了什么东西Super Block&#xff08;超级…

[m1pro ] ssh: connect to host localhost port 22: Connection refused

在学习Hadoop 的时候&#xff0c;使用 ssh localhost 遇到以下问题 原因&#xff1a; 本地没有打开远程登录 解决办法&#xff1a;打开远程登录 成功结果

leetcode刷题(剑指offer) 191.位1的个数

191.位1的个数 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 ‘1’ 的个数&#xff08;也被称为汉明重量&#xff09;。 提示&#xff1a; 请注意&#xff0c;在某些语言&#xff08;…

【Linux网络编程】网络编程套接字(1)

【Linux网络编程】网络编程套接字(1) 目录 【Linux网络编程】网络编程套接字(1)源IP地址和目的IP地址端口号端口号和进程ID的关系 网络通信TCP协议UDP协议网络字节序socket编程接口简单的UDP网络程序 作者&#xff1a;爱写代码的刚子 时间&#xff1a;2024.1.29 前言&#xff1…

时序预测 | Python基于Multihead-Attention-TCN-LSTM的时间序列预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 时序预测 | Python基于Multihead-Attention-TCN-LSTM的时间序列预测 Multihead-Attention-TCN-LSTM&#xff08;多头注意力-TCN-LSTM&#xff09;是一种结合了多个注意力机制、时序卷积网络&#xff08;TCN&#xff0…

ORB-SLAM策略思考之RANSAC

ORB-SLAM策略思考之RANSAC 1. 初始化器的RANSAC ORB-SLAM中的初始化器是一个端到端的地图初始化策略&#xff0c;即不需要人的参与双线程同时计算本质矩阵和单应性矩阵使用基于RANSAC和卡方检验的评价方法 为了保证两种算法评价的一致性&#xff0c;计算本质矩阵F和单应性矩阵…

ETCD监控方法以及核心指标

文章目录 1. 监控指标采集1.1 监控指标采集1.2 配置promethues采集和大盘 2. 核心告警指标3. 参考文章 探讨etcd的监控数据采集方式以及需要关注的核心指标&#xff0c;便于日常生产进行监控和巡检。 1. 监控指标采集 etcd默认通过/metrics指标暴露相关指标&#xff0c;因此不…