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 cfpdef subarraySum_base(nums, k):result=0for iIdx in range(len(nums)):iSum = nums[iIdx]if iSum == k:result += 1for jIdx in range(iIdx+1, len(nums)):iSum += nums[jIdx]if iSum == k:result += 1return resulttestcase_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 = 714result = 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 cfpdef subarraySum_ext1(nums, k):if len(nums)==1:if nums[0] == k:return 1else:return 0isumpref=[0] * len(nums)iSum = 0for iIdx in range(len(nums)):iSum += nums[iIdx]isumpref[iIdx] = iSumresult=0for iIdx in range(len(nums)):if iIdx==0 and nums[iIdx] == k:result += 1if isumpref[iIdx] == k:result += 1for jIdx in range(iIdx+1, len(nums)):if isumpref[jIdx]-isumpref[iIdx] == k:result += 1return resulttestcase_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 = 714result = 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 cfpdef subarraySum_ext2(nums, k):dictsumpref = {}isum, iresult = 0, 0for num in nums:isum += numif isum == k:iresult += 1if isum - k in dictsumpref:iresult += dictsumpref[isum - k]dictsumpref[isum] = dictsumpref.get(isum, 0) + 1return iresulttestcase_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 = 714result = 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.hqwc.cn/news/438883.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MOS管驱动电路设计及其中电阻的作用

MOS管驱动电路要求 为了能够充分精确地导通和关断MOS管&#xff0c;设计一种可靠稳定的驱动及保护电路是必要的。一般来说&#xff0c;MOS管的驱动电路需要满足以下要求&#xff1a; ① 开关管的开通过程&#xff0c;驱动电流能够提供较大的充电电流&#xff0c;尽量减少米勒电…

什么是正向代理?为什么要使用它?

在计算机网络中&#xff0c;代理服务器&#xff08;Proxy Server&#xff09;是一种充当客户端和目标服务器之间的中间人的计算机或应用程序。代理服务器可以用于多种目的&#xff0c;其中之一就是正向代理。 正向代理的定义 正向代理是一种代理服务器配置方式&#xff0c;它…

计网Lesson11 - 虚拟机网络环境及socket概述

文章目录 虚拟机的简述socket概述 虚拟机的简述 放张图在这&#xff0c;根本没明白是啥对啥&#xff0c;以后学了Linux再来吧 &#x1f626; socket概述 s o c k e t socket socket 是一种用于应用层的用户态与应用层以下的内核态交互的工具&#xff0c;本意为“插座”。 也就是…

第17节-高质量简历写作求职通关-投递反馈

&#xff08;点击即可收听&#xff09; 投递跟进和感谢信 如果对一家公司特别心仪&#xff0c;但是投递简历后一直得不到回复怎么办&#xff1f; 面试之后觉得自己没有表现好怎么办&#xff1f; 面试完几天了&#xff0c;依然没有得到回应怎么办&#xff1f; 这个时候你需要写一…

大模型:合成数据、安全挑战与知识注入

在如今这个快速发展的AI时代&#xff0c;大语言模型&#xff08;LLM&#xff09;的研究论文数量呈指数级增长&#xff0c;几乎到了人力无法一一阅读和消化的地步。然而&#xff0c;对这些研究成果的归纳和总结至关重要&#xff0c;因为它们描绘了LLM领域的未来发展轮廓。在近期…

kubernetes-kubectl命令行管理工具

一、kubectl与kubeconfig的关系 一个常见的报错&#xff1a; 解释&#xff1a; localhost:8080 - 这是一个kube-apiserver的非安全端口&#xff0c;还有一个对外端口是6443&#xff0c;kubectl默认先连接8080&#xff08;二进制默认开始8080&#xff0c;kubeadmin默认关闭8080&…

STL初识——string的用法

string 一.string的介绍二.string的使用2.1接口&#xff08;构造类型&#xff09;2.2string的遍历和访问第一种遍历方式第二种遍历方式补充&#xff08;反向迭代器&#xff09;rbeign&#xff0c;rend 2.2接口&#xff08;常用函数&#xff09;2.2.1反转字符串&#xff08;reve…

torch与cuda\cudnn和torchvision的对应

以上图片来源于这篇博客 于是&#xff0c;我需要手动下载0.9.0torchvision 直接在网站https://pypi.tuna.tsinghua.edu.cn/simple/后面加上torchvision&#xff0c;就不用ctrlF搜torchvision了&#xff0c;即进入下面这个网站&#xff0c;找到对应版本的包下载安装即可 https…

如何在Microsoft 365中编辑和使用Loop文档(Word篇)

今天我们来介绍一下如何在Microsoft 365的Word中去编辑和使用Loop文档。首先&#xff0c;进入Microsoft 365在线版的Word界面。 创建一个“空白文档”。 在Word菜单中选择“插入”-“Loop组件”。目前仅支持“清单”、“任务列表”和“投票”。以“任务列表”为例。 点击“任务…

十大排序算法之快速排序

快速排序 快速排序也称为分区交换排序&#xff0c;它采用的是分治思想&#xff0c;是冒泡排序的改良版。冒泡排序需要进行比较并交换的次数较多&#xff0c;因为它是在两个相邻数据之间进行比较并交换的操作&#xff0c;每次只能移动一个位置&#xff0c;而快速排序是在两个分…

Q-Bench:一种用于低级别视觉通用基础模型的基准测试

1. 引言 多模态大语言模型&#xff08;Multi-modality Large Language Models&#xff0c;后续简称多模态大模型&#xff09;能够提供强大的通用级别视觉感知/理解能力&#xff0c;甚至可以通过自然语言与人类进行无缝对话和互动。虽然多模态大模型的这些能力已经在多个视觉语…

[二叉树专题]判断平衡二叉树|二叉树所有路径|左叶子之和

一、判断平衡二叉树 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 思路&#xff1a;自下而上递归方法&#xff0c;其遍历顺序是后序遍历…