差分数组/前缀和

news2024/11/27 2:28:46

文章目录

  • 1094. 拼车
  • 1109. 航班预定统计
  • 303. 区域和检索 - 数组不可变
  • 560. 和为K的子数组
  • 523. 连续的子数组的和

1094. 拼车

在这里插入图片描述

class Solution {
    public boolean carPooling(int[][] trips, int capacity) {
        int[] diff = new int[1001]; // 记录每个站点改变的人数,比如增加几个人,减少几个人
        for(int[] trip : trips){
            int cnt = trip[0];
            int from = trip[1];
            int to = trip[2];
            diff[from] += cnt;
            diff[to] -= cnt;
        }
        int num = 0; // 记录每个站点车上的人数
        for(int i = 0; i < 1001; i++){
            num += diff[i];
            if(num > capacity){
                return false;
            }
        }
        return true;
    }
}

1109. 航班预定统计

在这里插入图片描述
在这里插入图片描述
原数组后一位元素 - 前一位元素,得到的就是差分数组

通过差分数组求前缀和,可以得到原数组。对原数组区间[l, r]增加inc,相当于对差分数组的diff[l] += inc,diff[r + 1] -= inc

class Solution {
    public int[] corpFlightBookings(int[][] bookings, int n) {
        int[] diff = new int[n];
        int m = bookings.length;
        for(int i = 0; i < m; i++){
            int l = bookings[i][0];
            int r = bookings[i][1];
            int cnt = bookings[i][2];
            diff[l - 1] += cnt;
            if(r < n) diff[r] -= cnt;
        }
        for(int i = 1; i < n; i++){
            diff[i] += diff[i - 1];
        }
        return diff;
    }
}

303. 区域和检索 - 数组不可变

在这里插入图片描述

我们对原数组的[l, r]区间求和,可以转换为前缀和数组的差:pre[r] - pre[l - 1]

对前缀和求差分数组,可以得到原数组
对差分数组求前缀和,也可以得到原数组

class NumArray {
    int n;
    int[] pre;

    public NumArray(int[] nums) {
        n = nums.length;
        pre = new int[n];
        pre[0] = nums[0];
        for(int i = 1; i < n; i++){
            pre[i] = pre[i - 1] + nums[i];
        }
    }
    
    public int sumRange(int l, int r) {
        if(l == 0) return pre[r];
        return pre[r] - pre[l - 1];
    }
}

560. 和为K的子数组

在这里插入图片描述

class Solution {
    public int subarraySum(int[] nums, int k) {
        // 也就是前缀和数组两数之差为k
        int n = nums.length;
        int[] pre = new int[n];
        pre[0] = nums[0];
        for(int i = 1; i < n; i++){
            pre[i] = pre[i - 1] + nums[i];
        }
        int ans = 0;
        // presum, cnt
        HashMap<Integer, Integer> map = new HashMap<>();
        map.put(0, 1);   // 表示pre[i]就是k,即[0,i]和为k
        for(int i = 0; i < n; i++){
            if(map.containsKey(pre[i] - k)){
                ans += map.get(pre[i] - k);
            }
            map.put(pre[i], map.getOrDefault(pre[i], 0) + 1);
        }
        return ans;
    }
}

523. 连续的子数组的和

在这里插入图片描述
若区间和为k的整数倍,说明前缀和数组两个元素的差应该是k的整数倍,也即每个元素%k后,余数相同。余数相同,则表示两数之差是k的整数倍

class Solution {
    public boolean checkSubarraySum(int[] nums, int k) {
        int n = nums.length;
        int[] pre = new int[n];
        pre[0] = nums[0];
        for(int i = 1; i < n; i++){
            pre[i] = pre[i - 1] + nums[i];
        }
        HashMap<Integer, Integer> map = new HashMap<>();
        map.put(0, -2); // 如果前缀和数组 某个数 % k 的余数就是0,说明[0, i]区间的和就是k的整数倍,下标设置为-2
        for(int i = 0; i < n; i++){
            if(map.containsKey(pre[i] % k)){
                if(i > 0 && i - map.get(pre[i] % k) >= 2){
                    // 同余的同时,还需要满足i > 0,因为i == 0时数组长度是1
                    return true;
                }
            }else{
                // 余数已经出现过了,就不再更新了
                map.put(pre[i] % k, i);
            }
        }
        return false;
    }
}

总结:

差分数组主要是把对原数组某个区间的操作,转换为对两端点的操作,[l, r] -> l, r + 1

前缀和数组可以把对原数组[l, r]区间求和的操作,转化为两端点的差pre[r] - pre[l - 1]

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

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

相关文章

c语言---指针

指针 前言 记录一个数据对象在内存中的存储位置&#xff0c;需要两个信息&#xff1a; 1、数据对象的首地址。 2、数据对象占用存储空间大小 基础数据类型所占内存空间大小&#xff08;字节&#xff09;&#xff0c;一个字节代表8个二进制位 char 1 short 2 int 4 lon…

Java中的网络编程------基于Socket的TCP编程和基于UDP的网络编程,netstat指令

Socket 在Java中&#xff0c;Socket是一种用于网络通信的编程接口&#xff0c;它允许不同计算机之间的程序进行数据交换和通信。Socket使得网络应用程序能够通过TCP或UDP协议在不同主机之间建立连接、发送数据和接收数据。以下是Socket的基本介绍&#xff1a; Socket类型&…

机器学习:可解释学习

文章目录 可解释学习为什么需要可解释机器学习可解释还是强模型可解释学习的目标可解释机器学习Local ExplanationGlobal Explanation 可解释学习 神马汉斯&#xff0c;只有在有人看的时候能够答对。 为什么需要可解释机器学习 贷款&#xff0c;医疗需要给出理由&#xff0c;让…

学生宿舍水电费自动缴费系统/基于javaweb的水电缴费系统

摘 要 “互联网”的战略实施后&#xff0c;很多行业的信息化水平都有了很大的提升。但是目前很多学校日常工作仍是通过人工管理的方式进行&#xff0c;需要在各个岗位投入大量的人力进行很多重复性工作&#xff0c;这样就浪费了许多的人力物力&#xff0c;工作效率较低&#x…

职场中的道德与伦理:如何在工作中坚守原则?

引言 在快节奏的职场环境中&#xff0c;道德与伦理问题时常出现&#xff0c;但却往往被忽视。面对各种压力和诱惑&#xff0c;如何在工作中坚守原则&#xff0c;不仅是个人修养的体现&#xff0c;也是职业成功的关键。本文将探讨职场中的道德与伦理问题&#xff0c;以及如何在…

Orangepi安装外设库 wiringPi

注意&#xff1a;mobaXterm传送文件要在SSH登陆环境下才可以。 同时电脑和orangepi都在同一个wifi下。

docker 笔记6:高级篇 DockerFile解析

目录 1.是什么&#xff1f; 2.构建三步骤 3.DockerFile构建过程解析 3.1 Dockerfile内容基础知识 3.2Docker执行Dockerfile的大致流程 总结 4.DockerFile常用保留字指令 5.案例&#xff1a;自定义镜像 5.1 要求&#xff1a; Centos7镜像具备vimifconfigjdk8 5.2编写 5…

deque容器

1 deque容器基本概念 功能&#xff1a; 双端数组&#xff0c;可以对头端进行插入删除操作 deque与vector区别&#xff1a; vector对于头部的插入删除效率低&#xff0c;数据量越大&#xff0c;效率越低deque相对而言&#xff0c;对头部的插入删除速度回比vector快vector访问…

如何在java中做基准测试

最近公司在搞新项目&#xff0c;由于是实验性质&#xff0c;且不会直接面对客户的项目&#xff0c;这次的技术选型非常激进&#xff0c;如&#xff0c;直接使用了Java 17。 作为公司里练习两年半的个人练习生&#xff0c;我自然也是深度的参与到了技术选型的工作中。不知道大家…

Gitea--私有git服务器搭建详细教程

一.官方文档 https://docs.gitea.com/zh-cn/说明 gitea 是一个自己托管的Git服务程序。他和GitHub, Gitlab等比较类似。他是从 Gogs 发展而来&#xff0c;gitea的创作团队重新fork了代码&#xff0c;并命名为giteagitea 功能特性多&#xff0c;能够满足我们所有的的代码管理需…

预推免,保研------长安大学保内,附加分面试准备【记录帖】

&#x1f680;长安大学——人工智能系——程惠泽 &#x1f68c;前六学期专业排名&#xff1a;7/82 &#x1f68c;信息门户GPA&#xff1a;3.94 &#x1f68c;平均成绩&#xff1a;89.83 &#x1f68c;加权成绩&#xff1a;89.15 / ☁️本人比较菜&#xff0c;只能保研本校&…

认识doubbo和rpc

开个新坑&#xff0c;和大家一起学习Dubbo 3.X。我们按照一个由浅入深顺序来学习&#xff0c;先从使用Dubbo开始&#xff0c;再深入Dubbo的核心原理。 今天我们就从认识Dubbo开始&#xff0c;整体的内容可以分为3个部分&#xff1a; Dubbo是什么RPC是什么Dubbo的架构 正式开…

面试如何回答弹性盒子布局这个问题呢?

在我们面试中如果被问道css方面的面试题 那么极有可能被问到的一道面试题就是弹性盒子&#xff0c;本篇文章通过一张图带你拿捏这道面试题。 1、首先需要说一说弹性盒子的基本概念&#xff1a;弹性盒子是一种用于网页布局中创建灵活和响应式设计的CSS布局模型。 2、其次需要说…

父组件调用子组件 ref 不生效?组件暴露 ref ?

向你的组件暴露 ref 要暴露 ref 最关键的就是 forwardRef forwardRef 是 React 中的一个高阶函数&#xff0c;用于在函数组件中将 ref 属性向下传递给子组件。 在 React 中&#xff0c;我们可以使用 ref 属性来获取对一个组件实例的引用&#xff0c;以便在父组件中操作子组件。…

IDEA复制一个工程为多个并启动,测试负载均衡

1 找到服务按钮 2 选择复制配置 3 更改新的名称与虚拟机参数 复制下面的代码在VM参数中 -Dserver.port8082 4 最后启动即可

【80天学习完《深入理解计算机系统》】第十二天3.6数组和结构体

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

排序之归并排序

文章目录 前言一、归并排序1、归并排序基本思想2、归并排序代码实现3、归并排序效率分析 二、归并排序非递归实现(循环实现)1、归并排序非递归实现(循环实现)基本思想2、归并排序非递归实现(循环实现)代码 三、计数排序1、计数排序基本思想2、计数排序代码实现3、计数排序效率分…

大数据-玩转数据-Flink状态编程(上)

一、Flink状态编程 有状态的计算是流处理框架要实现的重要功能&#xff0c;因为稍复杂的流处理场景都需要记录状态&#xff0c;然后在新流入数据的基础上不断更新状态。 SparkStreaming在状态管理这块做的不好, 很多时候需要借助于外部存储(例如Redis)来手动管理状态, 增加了编…

顺式元件热图+柱状图

写在前面 本教程来自粉丝投稿&#xff0c;主要做得是顺式元件的预测和热图绘制。类似的教程&#xff0c;在我们基于TBtools做基因家族分析也做过&#xff0c;流程基本一致。我们前期的教程&#xff0c;主要是基于TBtools&#xff0c;本教程主要是基于纯代码,也是值得学习收藏的…

【人工智能】—_线性分类器、感知机、损失函数的选取、最小二乘法分类、模型复杂性和过度拟合、规范化

文章目录 Linear predictions 线性预测分类线性分类器感知机感知机学习策略损失函数的选取距离的计算 最小二乘法分类求解最小二乘分类矩阵解法一般线性分类模型复杂性和过度拟合训练误差测试误差泛化误差复杂度与过拟合规范化 Linear predictions 线性预测 分类 从具有有限离…