LeetCode算法实践——前缀和从入门到入土

news2025/1/12 21:06:25

前缀和算法

对于一个数组a,和为s数组;其每一个下标的前缀和为s[0]=0,s[i]=s[i-1]+a[i]。

从上面可以推导出left到right之间的前缀和为是s[right+1]-s[left]。

例如a=[3,2,1,2],对应的前缀和数组为s=[0,3,5,6,8]。a的子数组[2,1,2]的和就可以用s[4]−s[1]=8−3=5算出来。
在这里插入图片描述

算法实践

LeetCode 930. 和相同的二元子数组

给你一个二元数组nums,和一个整数goal,请你统计并返回有多少个和为goal的非空子数组。

解题思路

定义前缀和数组sum,如果i…j之间和为goal,那么有sum[j]-sum[i]=goal。因此可以枚举j即可。实际解题时可以用哈希记录每一种前缀和出现的次数。

class Solution {
    public int numSubarraysWithSum(int[] nums, int goal) {
        if (nums==null || nums.length==0){
            return 0;
        }
        int sum=0;
        HashMap<Integer,Integer>cnt=new HashMap<>();
        int res=0;
        for(int num:nums){
            cnt.put(sum,cnt.getOrDefault(sum,0)+1);
            sum+=num;
            res+=cnt.getOrDefault(sum-goal,0);
        }

        return res;

    }
}

LeetCode 560. 和为 K 的子数组

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

解题思路

跟930题一致。

LeetCode 524. 和为奇数的子数组数目

给你一个整数数组arr。请你返回和为奇数的子数组数目。

由于答案可能会很大,请你将结果对10^9+7取余后返回。

解题思路

求子数组和可以通过前缀和的方式,本题中只需要维护奇数和偶数的数量,不需要维护前缀和数组。

class Solution {
    public int numOfSubarrays(int[] arr) {
        final int MODULO = 1000000007;
        int odd = 0, even = 1;
        int subarrays = 0;
        int sum = 0;
        int length = arr.length;
        for (int i = 0; i < length; i++) {
            sum += arr[i];
            subarrays = (subarrays + (sum % 2 == 0 ? odd : even)) % MODULO;
            if (sum % 2 == 0) {
                even++;
            } else {
                odd++;
            }
        }
        return subarrays;
    }
}

LeetCode 面试题 17.05. 字母与数字

给定一个放有字母和数字的数组,找到最长的子数组,且包含的字母和数字的个数相同。

返回该子数组,若存在多个最长子数组,返回左端点下标值最小的子数组。若不存在这样的数组,返回一个空数组。

解题思路

一个子数组包含的字母和数字的个数相同,等价于该子数组包含的字母和数字的个数之差为0,可以将字母转为-1,数字转为1。问题等价于在转换后的数组中寻找元素和为0的最长子数组。

为了在转换后的数组中寻找元素和为0的子数组,可以计算转换后的数组的前缀和,如果两个下标对应的前缀和相等,则这两个下标之间的子数组的元素和为0。

使用哈希表记录每个前缀和第一次出现的下标。由于空前缀的前缀和是0且对应下标-1,因此首先将前缀和0与下标-1存入哈希表。

class Solution {
    public String[] findLongestSubarray(String[] array) {
        HashMap<Integer,Integer>map=new HashMap<>();
        map.put(0,-1);
        int sum=0;
        int maxLen=0;
        int startIndex=-1;
        int len=array.length;
        for(int i=0;i<len;i++){
            if (Character.isLetter(array[i].charAt(0))){
                sum++;
            }else{
                sum--;
            }
            if (map.containsKey(sum)){
                int index=map.get(sum);
                if (i-index>maxLen){
                    maxLen=i-index;
                    startIndex=index+1;
                }
            }else{
                map.put(sum,i);
            }
        }    
        if (maxLen == 0) {
            return new String[0];
        }
        String[] ans = new String[maxLen];
        System.arraycopy(array, startIndex, ans, 0, maxLen);
        return ans; 
    }
}

总结

前缀和技术主要用于高效地计算数组的区间和,在需要快速求解子数组或子序列的问题中非常有用。以下是前缀和的一些典型应用场景:

  • 求解区间和:通过前缀和,我们可以在常数时间内计算出数组任何区间[l, r]的和,计算公式为 S[r] - S[l-1],其中 S[] 是前缀和数组。

  • 统计问题:前缀和可以用于解决一些统计问题,如计算数组中正数和负数的数量,或者统计某个元素出现的次数等。

  • 坐标缩放问题:在处理坐标系相关的问题时,前缀和技术可以用来计算新的坐标值,例如在坐标缩放问题中,可以通过前缀和技术快速计算出每个点的新坐标。

  • 哈希表结合使用:在需要快速检索的场景中,前缀和技术经常与哈希表结合使用,以提高查询效率。

  • 动态规划:在一些动态规划问题中,前缀和技术可以用来优化状态转移方程,减少计算量。

综上所述,前缀和是一种非常实用的技术,其可以在各种需要快速求解子数组或子序列的场景中发挥作用,尤其在与哈希表结合使用时,能够显著提高算法的效率。

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

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

相关文章

MybatisPlus多表联查-分页关联查询+根据id获取多表联查后的单行数据

分页关联查询 需求分析 有两张表w以及d&#xff0c;需要w的一些字段以及d的一些字段在前端显示 此时就需要用到关联查询&#xff0c;查询到的数据放入视图类&#xff0c;显示在前端 项目结构 视图类 package com.wedu.modules.tain.entity.vo;import lombok.Data;import ja…

深度学习基础——U-Net图像分割

图像分割&#xff0c;就是根据图像的某种相似性特征(如亮度、颜色、纹理、面积、形状、位置、局部统计特征或频谱特征等&#xff09;将医学图像划分为若干个互不相交的“连通”区域。 相关特征在同一区域内表现出一致性或相似性&#xff0c;而在不同区域间表现出明显的…

阿赵UE学习笔记——16、渲染性能相关

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的使用。上一篇说了灯光的移动性问题&#xff0c;这一篇来看看怎样去辨别灯光性能的好坏。   虚幻引擎里面有一组显示模式是专门用来看场景当前的灯光和网格渲染的&#xff0c;叫做优化试图模式&#x…

动态内存管理(中)

动态内存管理&#xff08;上&#xff09;-CSDN博客&#xff08;malloc&#xff0c; realloc&#xff0c; calloc&#xff0c; free函数的用法以及注意事项等知识点&#xff09; 目录 1.对空指针的解引用操作 2.对动态开辟空间的越界访问 3.对非动态内存开辟空间使用free空间…

SpringBoot + Nacos 实现动态化线程池

1.背景 在后台开发中&#xff0c;会经常用到线程池技术&#xff0c;对于线程池核心参数的配置很大程度上依靠经验。然而&#xff0c;由于系统运行过程中存在的不确定性&#xff0c;我们很难一劳永逸地规划一个合理的线程池参数。 在对线程池配置参数进行调整时&#xff0c;一…

网络:SNMP协议

1. SNMP技术原理 SNMP的结构包括网管站NMS&#xff08;Network Management Station&#xff09;和Agent两部分。SNMP协议是规定NMS和Agent之间如何传递管理信息的应用层协议&#xff08;UDP协议&#xff0c;使用162端口&#xff09;。 2. SNMP版本 SNMPv1:方便实现&#xff0c…

怎么在电脑上做工作笔记?电脑桌面电子笔记软件

在繁忙的职场中&#xff0c;随时随地记录工作笔记是许多职场人士的日常需求。这不仅包括了会议记录、项目进展&#xff0c;还有一些灵感、规划和工作要点&#xff0c;都需要随手记下&#xff0c;以便随时查看和回顾。那么我们如何在电脑上做工作笔记更高效、便捷呢&#xff1f;…

Python实现线性逻辑回归和非线性逻辑回归

线性逻辑回归 # -*- coding: utf-8 -*- """ Created on 2024.2.20author: rubyw """import matplotlib.pyplot as plt import numpy as np from sklearn.metrics import classification_report from sklearn import preprocessing from sklearn…

jmeter 命令行启动 动态参数化

[Jmeter命令行参数] 一、在linux中&#xff0c;使用非gui的方式执行jmeter。若需更改参数&#xff0c;必须先编辑jmx文件&#xff0c;找到对应的变量进行修改&#xff0c;比较麻烦。因此&#xff0c;可以参数化一些常用的变量&#xff0c;直接在Jmeter命令行进行设置 二、参数…

信息安全法律法规体系

信息安全法律法规体系 我国信息安全法规体系可以分为4层。 法律层面具体对应的法律、法规一般性法律规定宪法、国家安全法、国家秘密法、治安管理处理条例等虽然没有专门针对信息安全的条款,但约束了信息安全相关的行为规范和惩罚信息网络犯罪的法律《中华人名共和国刑法》《…

专家之路上的Flow高级秘籍

公众号「稀有猿诉」 原文链接 专家之路上的Flow高级秘籍 『君不见&#xff0c;黄河之水天上来&#xff0c;奔流到海不复回。』 学习与河流一样&#xff0c;一方面学无止境&#xff0c;又是逆水行舟&#xff0c;不进则退&#xff0c;因为其他人都在卷。前文一篇文章讲了F…

单片机02_寄存器_GPIO设置

芯片概述 C51&#xff1a;0口、1口、2口、3口&#xff0c;P00~p07、P10~P17、P20~P27、P30~P37 STM32&#xff1a;A口、B口、C口、D口&#xff0c;PA0~PA15/PA5 GPIOA.5 STM32F407ZGT6有7组GPIO端口&#xff0c;分别是&#xff1a;A B C D E F G&#xff0c;每组均有16个GPIO端…

com.alibaba.fastjson.JSONException: toJSON error的原因

问题&#xff1a; 导出接口报错&#xff0c;显示json格式化异常 发现问题&#xff1a; 第一个参数为HttpResponse,转换成json的时候报错 修改方法&#xff1a; 1.调换两个参数的位置 2.在aop判断里边 把ServletAPI过滤掉 Before("excudeWebController()")pub…

Leetcode1206(设计跳表)

例题&#xff1a; 分析&#xff1a; 我们先来找一找跳表与单链表的相同点和不同点。 相同点&#xff1a; 跳表和单链表一样&#xff0c;都是由一个一个的节点组成的链表。 不同点&#xff1a; ①&#xff1a;跳表中的元素已经是排好序的&#xff08;图中从小到大&#xff09;&…

突破性创新:OpenAI推出Sora视频模型,预示视频制作技术的未来已到来!

一、前言 此页面上的所有视频均由 Sora 直接生成&#xff0c;未经修改。 OpenAI - Sora is an AI model that can create realistic and imaginative scenes from text instructions. 2024 年 2 月 16 日&#xff0c;OpenAI 发布 AI 视频模型 Sora&#xff0c;60 秒的一镜到底…

STM32-启用蜂鸣器

目录 1 、电路构成及原理图 2、编写实现代码 main.c beep.c beep.h 3、代码讲解 4、 烧录到开发板调试、验证代码 5、检验效果 本人使用的是朗峰 STM32F103 系列开发板&#xff0c;此笔记基于这款开发板记录。 1 、电路构成及原理图 首先&#xff0c;通过朗峰 F1 开…

VILT算法解读

VILT是一种典型的单塔结构&#xff0c;不同于双塔结构由两个独立的Image Encoder以及Text Encoder组成&#xff08;比如clip&#xff09;&#xff0c;单塔结构的模型一般只有一个共用的编码器&#xff0c;称为Multi-Modal Encoder。 1、VILT算法原理 VILT被认为是最简单的…

SpringBoot中使用PageHelper插件实现Mybatis分页

场景 SpringBoot中整合Mybatis时一般添加的依赖为 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.1</version></dependency> 如果要实现分页查…

PostgreSQL按日期列创建分区表

在PostgreSQL中&#xff0c;实现自动创建分区表主要依赖于表的分区功能&#xff0c;这一功能从PostgreSQL 10开始引入。分区表可以帮助管理大量数据&#xff0c;通过分布数据到不同的分区来提高查询效率和数据维护的便捷性。以下是在PostgreSQL中自动创建分区表的一般步骤&…