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

本文为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 ~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AS自治系统中的路由协议---RIP、OSPF、BGP

一、AS --- 自治系统 将网络分块管理 --- 由单一的机构或组织所管理 的一系列IP网络及其设备的集合 AS的管理&#xff1a;为了方便对AS进行管理&#xff0c;我们给AS设计了一个编号称为AS 号 --- 16位二进制构成 --- 0 - 65535 ---- 目前也存在拓展版的AS 号 --- 32位二进制构…

计网Lesson12 - UDP客户服务器模型和UDP协议

文章目录 丢个图在这&#xff0c;实在不是很明白在讲啥&#xff0c;等学完网编的我归来狠狠拿下它

GitHub 上传文件夹到远程仓库、再次上传修改文件、如何使用lfs上传大文件、github报错一些问题

按照大家的做法&#xff0c;把自己遇到的问题及解决方案写出来&#xff08;注意&#xff1a;Error里面有些方法有时候我用可以成功&#xff0c;有时候我用也不能成功&#xff0c;写出来仅供参考&#xff0c;实在不行重头再clone&#xff0c;add&#xff0c;commit&#xff0c;p…

Java强训day9(选择题编程题)

选择题 class Person {String name "No name";public Person(String nm) {name nm;} } class Employee extends Person {String empID "0000";public Employee(String id) {super(" ");//要调用父类的有参构造方法否则报错empID id;} } pu…

STM32 串口协议简明教程

前言 本文旨在介绍STM32单片机串口协议的使用。 主要是为了个人复习&#xff0c;一段时间没用&#xff0c;就容易忘记。因此在文章中也不会出现串口的原理等讲解。 本文的重点是利用CubeMX实现一个最基本的串口模板&#xff0c;从而能够在往后的各个项目中得到运用。 本文使用…

老龄化对投资意味着什么?

1月15日&#xff0c;国务院办公厅印发《关于发展银发经济增进老年人福祉的意见》从4个方面提出26项举措&#xff0c;为我国首个以“银发经济”命名的政策文件。 近期&#xff0c;国信证券分析师王开发布题为《银发经济再思考&#xff1a;老龄化对投资的影响》的报告&#xff0…

Java8-Stream 流基本应用-groupBy进行分组

groupBy进行分组 Testpublic void testStreamGroupBy(){List<UserInfoModel> resultnew ArrayList<>();for (int i 0; i < 10; i) {UserInfoModel usernew UserInfoModel();user.setUserId(i"");user.setUserName("kangshihang");result.a…

探索设计模式的魅力:深入了解适配器模式-优雅地解决接口不匹配问题

设计模式专栏&#xff1a;http://t.csdnimg.cn/nolNS 目录 一、引言 1. 概述 2. 为什么需要适配器模式 3. 本文的目的和结构 二、简价 1. 适配器模式的定义和特点 定义 特点 2. 适配器模式的作用和适用场景 作用 适用场景 3. 适配器模式与其他设计模式的比较 三、适配…

代码增强LLM

大模型时代的语言模型&#xff08;LLM&#xff09;不仅在尺寸上变得更大了&#xff0c;而且训练数据也同时包含了自然语言和形式语言&#xff08;代码&#xff09;。作为人类和计算机之间的媒介&#xff0c;代码可以将高级目标转换为可执行的中间步骤&#xff0c;具有语法标准、…

Java 与 JavaScript的区别

Java 与 JavaScript的区别 Java 与 JavaScript&#xff1a;概述Java的特点JavaScript 的起源JavaScript 的特点Java 与 JavaScript&#xff0c;哪个更好&#xff1f;JavaScript 与 Java 相似吗&#xff1f;Java 与 JavaScript 的区别JavaScript 在服务器端的运行方式是怎样的&a…

线程锁多线程的复习

线程 实现方式3种乐观锁&悲观锁线程池线程池总结 进程:是正在运行的程序 线程:是进程中的单个顺序控制流,是一条执行路径 实现方式3种 1.Thread //步骤一:定义一个继承Thread的类 //步骤二:再定义的类中重写run()方法 //步骤三:创建定义类对象 //步骤四:启动线程 class M…

【数据分析】numpy基础第一天

文章目录 前言本文代码&#xff1a;使用jupyter notebook打开本文的代码操作示例步骤1.打开Anaconda Powershell Prompt步骤2.复制代码文件地址步骤3.在Anaconda Powershell Prompt中打开jupyter notebook步骤3.5.解决一个可能的问题步骤4.在浏览器中查看ipynb文件步骤5.运行代…

85.网游逆向分析与插件开发-物品使用-物品使用的逆向分析与C++代码的封装

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;项目需求与需求拆解-CSDN博客 码云地址&#xff08;ui显示角色数据 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;453dd83d54140d2e1ee65c9…

量化交易学习3(量化择时策略)

1 什么是量化择时 量化择时策略&#xff0c;简单来说&#xff0c;就是采用数量化分析方法&#xff0c;利用单个或多个技术指标的组合&#xff0c;来对交易标的股票或股票指数进行低买高卖的操作&#xff0c;期望获得超越简单买入持有策略的收益风险表现。 量化择时策略的核心…

网络防御安全知识(第三版)

配置黑洞路由 --- 黑洞路由即空接口路由&#xff0c;在NAT地址池中的地址&#xff0c;建议配置达到这个地址指 向空接口的路由&#xff0c;不然&#xff0c;在特定环境下会出现环路。&#xff08;主要针对地址池中的地址和出接口地址 不再同一个网段中的场景。&#xff09; …

二手交易|校园二手交易小程序|基于微信小程序的闲置物品交易平台设计与实现(源码+数据库+文档)

校园二手交易小程序目录 目录 基于微信小程序的闲置物品交易平台设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、商品信息管理 3、公告信息管理 4、论坛信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕…

档案数字化转型面临问题

档案数字化转型面临以下问题&#xff1a; 1. 技术问题&#xff1a;档案数字化需要借助先进的技术手段和设备&#xff0c;包括扫描仪、存储设备和数据管理软件等。这些技术的成本高、操作复杂&#xff0c;需要专业的人员进行操作和维护。 2. 安全问题&#xff1a;档案数字化后的…

重写Sylar基于协程的服务器(0、搭建开发环境以及项目框架 || 下载编译简化版Sylar)

重写Sylar基于协程的服务器&#xff08;0、搭建开发环境以及项目框架 || 下载编译简化版Sylar&#xff09; 重写Sylar基于协程的服务器系列&#xff1a; 重写Sylar基于协程的服务器&#xff08;0、搭建开发环境以及项目框架 || 下载编译简化版Sylar&#xff09; 前言 sylar是…

[C语言][C++][时间复杂度详解分析]二分查找——杨氏矩阵查找数字详解!!!

一&#xff0c;题目 遇到的一道算法题&#xff1a; 1&#xff0c;已知有一个数字矩阵&#xff08;row行&#xff0c;col列&#xff09;&#xff0c;矩阵的每行 从左到右 递增&#xff0c;每列 从上到下 递增。 2&#xff0c;现输入一个数字 num &#xff0c;判断数字矩阵中…

Python列表中的append功能及用法举例

Python列表中的append功能及用法举例 &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;append()&#x1f333;&#x1f340;功能介绍&#x1f340;&#x1f340;语法&#x1f340;&#x1f340;示例&#x1f340;&#x1f340;注意事项&#x…