当前位置: 首页 > news >正文

LeetCode100-560和为K的子数组

本文基于各个大佬的文章

上点关注下点赞,明天一定更灿烂!


前言

        Python基础好像会了又好像没会,所有我直接开始刷leetcode一边抄样例代码一边学习吧。本系列文章用来记录学习中的思考,写给自己看的,也欢迎大家在评论区指导~

        您的每一条评论都会让我更有学习的动力。


一、分析题目

本题目分组是【子串】

子串(Substring) 是指字符串中连续的字符序列,由原字符串中任意位置开始、任意位置结束的连续字符组成。

示例:对于字符串 "abcde"

  • 长度为 1 的子串:"a", "b", "c", "d", "e"
  • 长度为 2 的子串:"ab", "bc", "cd", "de"
  • 长度为 3 的子串:"abc", "bcd", "cde"
  • 以此类推,最长子串是原字符串本身

子串 vs 子序列

子串是连续的,子序列可以是非连续的但保持顺序。

特性子串(Substring)子序列(Subsequence)
连续性必须连续可以不连续
字符顺序保持原顺序保持原顺序
数量n (n+1)/2 个非空子串2ⁿ-1 个非空子序列
示例("abc")"a", "b", "c", "ab", "bc", "abc""a", "b", "c", "ab", "ac", "bc", "abc”

本题的题目是子数组,那么他们两者的关系是什么呢

  • 子串:用于字符串,由字符组成的连续序列
  • 子数组:用于数组,由元素组成的连续序列

二、思路以及代码

思路:子数组是由元素组成的连续序列,可以借助滑动窗口,而且是长度可变的滑动窗口

class Solution:def subarraySum(self, nums: List[int], k: int) -> int:sum=0left=0count=0for right in range(len(nums)):sum+=nums[right]while sum>k and left<=right:sum-=nums[left]left+=1if sum==k:count+=1return count

提交之后答案是错误的,我重新回去看了题目要求,要求数组的数字可能含有负数,所有我这个办法是不能这么写的。

看看其他办法。问了一下deep老师,老师说因为数组不是非负数,所有负数可能会导致窗口内数字和变大或者变小,移动策略无法处理。推荐的方法是使用前缀和+哈希表(字典)实现。

我们先来了解一下什么是前缀和吧。

前缀和的概念:前缀和是一种预处理技巧,用于快速计算数组中某段子数组的元素的总和。

  • 定义:对于一个数组 nums,它的前缀和数组 prefix_sums 的定义如下:

    • prefix_sums[i] nums[0] + nums[1] + ... + nums[i]i从0开始。
      nums = [1, 2, -1, 3, 4]
      prefix_sums = [1, 3, 2, 5, 9]  # 计算方法: 1, 1+2, 1+2-1, 1+2-1+3, 1+2-1+3+4
      

对于这个题目,我们可以设置一个哈希表,哈希表的key是前缀和,value是这个前缀和出现的次数。也是就我们想要求得前缀和为k,然后value是k出现的次数,也就是我们最后求的子串组数。

from typing import Listdef subarraySum(nums: List[int], k: int) -> int:count = 0prefix_sum = 0prefix_sums = {0: 1}   # 初始化,前缀和为0时出现一次(代表空子数组的和为0)for num in nums:prefix_sum += num # 计算当前的前缀和# 查看是否存在前缀和为 current_sum - kif (prefix_sum - k) in prefix_sums: # 这个时候,如果存在,说明从之前的某个位置到当前位置的和正好是kcount += prefix_sums[prefix_sum - k] # 出现多少次,就加上多少,比如prefix_sums[prefix_sum - k] = 3,说明之前有3个满足条件的前缀和,所以count要增加3# 更新字典中的前缀和出现次数prefix_sums[prefix_sum] = prefix_sums.get(prefix_sum, 0) + 1 # 更新哈希表,当前的前缀和出现了多少次return count

成功通过

三、本题收获

prefix_sums[prefix_sum] = prefix_sums.get(prefix_sum, 0) + 1

prefix_sums 字典中获取键 prefix_sum 对应的值。

如果 prefix_sum 作为键存在于字典中,则 get() 方法返回该键对应的值(也就是该前缀和出现的次数)。

如果 prefix_sum 作为键不存在于字典中,则 get() 方法返回第二个参数的值作为默认值,这里是 0


总结

        只会打暴力,基础一团糟,明天再学吧老铁,别真学会了。

http://www.dtcms.com/a/338880.html

相关文章:

  • 开源 C++ QT Widget 开发(二)基本控件应用
  • leetcode_ 76 最小覆盖子串
  • 决策树(续)
  • 大数据技术栈 —— Redis与Kafka
  • 字符串与算法题详解:最长回文子串、IP 地址转换、字符串排序、蛇形矩阵与字符串加密
  • 磨砂玻璃登录页面使用教程 v0.1.1
  • 【Linux仓库】进程创建与进程终止【进程·柒】
  • 通过C#上位机串口写入和读取浮点数到stm32的片内flash实战4(通过串口下发AD9833设置值并在上位机显示波形曲线)
  • 基于单片机智能点滴输液系统
  • 元素的width和offsetWidth有什么区别
  • java八股文-中间件-参考回答
  • Win11家庭版docker安装MaxKB
  • 【论文阅读】DETR3D: 3D Object Detection from Multi-view Images via 3D-to-2D Queries
  • 边缘智能体:Go编译在医疗IoT设备端运行轻量AI模型(中)
  • 【HTML】3D动态凯旋门
  • 【SpringBoot】15 核心功能 - Web开发原理 - 请求处理 - 常用请求参数注解
  • 【SpringBoot】Dubbo、Zookeeper
  • 【完整源码+数据集+部署教程】鳄梨表面缺陷检测图像分割系统源码和数据集:改进yolo11-MLCA
  • C语言第九章字符函数和字符串函数
  • Go语言快速入门指南(面向Java工程师)
  • 基于SpringBoot+Vue的养老院管理系统的设计与实现 智能养老系统 养老架构管理 养老小程序
  • 外网-内网渗透测试(文件上传漏洞利用)
  • MySQL事务篇-事务概念、并发事务问题、隔离级别
  • 链表基本运算详解:查找、插入、删除及特殊链表
  • 线段树结合矩阵乘法优化动态规划
  • 如何让你的知识分享更有说服力?
  • 云计算核心技术之云存储技术
  • 【React】简单介绍及开发环境搭建
  • JVM 面试精选 20 题(续)
  • react-quill-new富文本编辑器工具栏上传、粘贴截图、拖拽图片将base64改上传服务器再显示