LeetCode[327]区间和的个数

news2024/11/25 22:50:35

难度:Hard

题目:

给你一个整数数组 nums 以及两个整数 lower 和 upper 。求数组中,值位于范围 [lower, upper] (包含 lower 和 upper)之内的 区间和的个数 。

区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。


示例 1:

输入:nums = [-2,5,-1], lower = -2, upper = 2
输出:3
解释:存在三个区间:[0,0]、[2,2] 和 [0,2] ,对应的区间和分别是:-2 、-1 、2 。

 示例 2:

输入:nums = [0], lower = 0, upper = 0
输出:1

提示:

  • 1 <= nums.length <= 105
  • -231 <= nums[i] <= 231 - 1
  • -105 <= lower <= upper <= 105
  • 题目数据保证答案是一个 32 位 的整数

 Related Topics

  • 树状数组
  • 线段树
  • 数组
  • 二分查找
  • 分治
  • 有序集合
  • 归并排序

重点!!!解题思路

明确解题思路: 

      (1)题目要求求出区间和,根据区间和即可想到前缀和

      (2)那么将此题简化,前缀和相减即为区间和,这样即可列出一个式子:假设前缀和数组为nums,那么区间和为nums[j]-nums[i],加上区间和范围即lower<=nums[j]-nums[i]<=upper

      (3)式子继续简化nums[j]-lower>=nums[i]>=nums[j]-upper,通过式子可以看出如果我们能固定j的位置即可求出i的位置范围a<=nums[i]<=b

      (4)这样通过找到a和b的范围,即可确定在a和b的区间和个数为b-a+1

      (5)如果想j再往后走一位,这时如果nums[j+1]>nums[j] 那么根据公式我们nums[j+1]的a和b一定大于nums[j]的a和b

      (6)那么我们如何保证nums[j+1]一定大于nums[j]呢 这时我们就可以联想到归并排序了,因为归并排序的时候就是先分开递归再并在一起排序

      (7)明白以上思路 即可做题了

源码+讲解:

    class Solution {
        long[] temp;

        public int countRangeSum(int[] nums, int lower, int upper) {
            long[] sum = new long[nums.length + 1];
            temp = new long[nums.length + 1];
            sum[0] = 0;
            for (int i = 0; i < nums.length; i++) sum[i + 1] = sum[i] + nums[i];  //求一个前缀和数组
            return merge_sort(sum, 0, sum.length - 1, lower, upper);  //我们归并排序的就是一个前缀和数组
        }
        //这里就是一个很基础的归并排序,不懂得朋友请看本章节的其他题巩固一下
        public int merge_sort(long[] sum, int l, int r, int lower, int upper) {
            if (l >= r) return 0;
            int mid = (l + r) >> 1, ans = 0;
            ans += merge_sort(sum, l, mid, lower, upper);
            ans += merge_sort(sum, mid + 1, r, lower, upper);
            ans += countTwoPart(sum, l, mid, mid + 1, r, lower, upper);  //在合并前进行区间和个数的判断
            int k = l, p1 = l, p2 = mid + 1;
            while (p1 <= mid || p2 <= r) {
                if (p2 > r || (p1 <= mid && sum[p1] < sum[p2])) {
                    temp[k++] = sum[p1++];
                } else {
                    temp[k++] = sum[p2++];
                }
            }
            for (int i = l; i <= r; i++) sum[i] = temp[i];
            return ans;
        }

        public int countTwoPart(long[] sum, int l1, int r1, int l2, int r2, int lower, int upper) {
            int k1 = l1, k2 = l1, ans = 0;
            for (int j = l2; j <= r2; j++) {  //通过固定模拟nums[j]的位置来计算k1,k2的边界
                long a = sum[j] - upper;
                long b = sum[j] - lower;
                while (k1 <= r1 && sum[k1] < a) k1++;  //k1移动到a的位置
                while (k2 <= r1 && sum[k2] <= b) k2++;  //k2移动到b+1的位置
                ans += k2 - k1;  //得到k1,k2的边界,其中k1-k2就是区间和个数
            }
            return ans;
        }
    }

运行结果:

如果您还有什么疑问或解答有问题,可在下方评论,我会及时回复。

系列持续更新中,点个订阅吧,喜欢练习算法那就点个攒吧 

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

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

相关文章

一文了解UML

目录 1 什么是UML? 2 UML视图&#xff08;UML View&#xff09; 2.1 用户视图&#xff08;Users View&#xff09; 2.2 结构视图&#xff08;Structural Views&#xff09; 2.3 行为视图&#xff08;Behavioral Views&#xff09; 2.4 环境视图&#xff08;Environmenta…

Vc - Qt - 自定义ComboBox

示例代码创建了一个名为ComboBoxWidget的自定义QWidget类&#xff0c;并在initUI方法中创建了一个垂直布局。然后将一个只读的QLineEdit和一个QPushButton添加到布局中。当按钮被点击时&#xff0c;会调用showMenu方法&#xff0c;该方法创建一个QMenu并添加选项。每个选项连接…

vite打包性能优化以及填坑

目录 前言 项目优化前 分析 优化 拆分包 去除debugger CDN 加速 按需导入 文件压缩 图片压缩 viteImagemin报错 填坑 坑1 坑2 总结 配置 前言 最近在使用 Vite4.0 构建一个中型前端项目的过程中&#xff0c;遇到了一些坑&#xff0c;也做了一些项目在构建生产环…

RepViT:从ViT的角度重新审视mobile CNN

文章目录 RepViT: Revisiting Mobile CNN From ViT Perspective摘要本文方法代码实验结果 RepViT: Revisiting Mobile CNN From ViT Perspective 摘要 近年来&#xff0c;与轻量级卷积神经网络(cnn)相比&#xff0c;轻量级视觉变压器(ViTs)在资源受限的移动设备上表现出了更高…

JVM系统优化实践(21):GC生产环境案例(四)

您好&#xff0c;这里是「码农镖局」CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e; 前面说了一般应用的OOM情况&#xff0c;但是OOM不知发生在应用层&#xff0c;有时候专门负责运行Java的Tomcat也会偶尔罢工一下&#xff0c;抛出OOM异常。因为Tomcat本身也…

git在工作区和本地库的操作命令

本文介绍一些开发时&#xff0c;常用的在工作区和本地库之间的操作命令 一、提交修改内容到 本地库 工作树的修改内容要提交到本地库&#xff0c;首先需要先添加到缓存区stage&#xff0c;在commit到本地库。 # filename就是你修改后需要提交的文件 git add <filename>…

unity进阶--json的使用学习笔记

文章目录 unity自带的json使用方法第三方--LitJson的使用第一种使用方式第二种--使用jsonData unity自带的json使用方法 创建数据类 转化成json 解析json 第三方–LitJson的使用 第一种使用方式 数据类 创建和解析 第二种–使用jsonData 创建 解析

奇舞周刊第500期:TQL,巧用 CSS 实现动态线条 Loading 动画

记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞推荐 ■ ■ ■ TQL&#xff0c;巧用 CSS 实现动态线条 Loading 动画 最近&#xff0c;群里有个很有意思的问题&#xff0c;使用 CSS 如何实现如下 Loading 效果&#xff1a; leaferjs&#xff0c…

docker安装redis启动异常问题

问题描述 启动redis容器报错如下 se > /sys/kernel/mm/transparent_hugepage/enabled as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled (set to madvise or never). 1:M 21 Ju…

Python - Opencv应用实例之树叶自动分割、标签及统计分析系统

Python - Opencv应用实例之树叶自动分割、标签及统计分析系统 本文通过Python+opencv 实现这样的需求:输出位置和角度(x, y, r),并标记出轮廓基于传统图像处理算法实现,算法原理:输入图像 -> 灰度化 -> 二值化 -> 形态学处理 -> 轮廓提取 -> 树叶中心定位 -…

docker系列5:docker安装nginx

传送门 前面介绍了docker的安装&#xff1a;docker系列1&#xff1a;docker安装 还有docker镜像加速器&#xff1a;docker系列2&#xff1a;阿里云镜像加速器 以及docker的基本操作&#xff1a; docker系列3&#xff1a;docker镜像基本命令 以及容器的基本命令&#xff1a;…

DRL(自用)

RL学习算法 基于策略的算法&#xff1a;这是最通用的优化类型。策略将状态映射到操作。学习策略的 RL 代理可以创建从当前状态到目标状态的动作轨迹 REINFORCE 是一种基于策略的算法。基于策略的算法&#xff0c;优势在于它们可以应用于各种强化学习问题&#xff1b;但是其样…

1 js嵌入html使用

1.1 直接在html内部使用js代码 使用script标签&#xff0c;在前后标签内部写的代码即为js代码。 <body><p id"p1">初始段落</p> <!--id是为了定位需要更改内容的标签--><button type"button" onclick"showNum()">…

App测试中ios和Android的区别

1、Android长按home键呼出应用列表和切换应用&#xff0c;然后右滑则终止应用&#xff1b; 2、多分辨率测试&#xff0c;Android端20多种&#xff0c;ios较少&#xff1b; 3、手机操作系统&#xff0c;Android较多&#xff0c;ios较少且不能降级&#xff0c;只能单向升级&…

【Spring MVC】Spring MVC的功能使用和相关注解介绍

Spring MVC主要有三个功能&#xff1a; 连接获取参数输出数据 对于 Spring MVC 来说&#xff0c;掌握了以上 3 个功能就相当于掌握了Spring MVC。 1.连接 连接的功能&#xff1a;将⽤户&#xff08;浏览器&#xff09;和 Java 程序连接起来&#xff0c;也就是访问⼀个地址能…

Docker 续2

Docker 续2 一、Docker 的数据管理1.1 数据卷1.2 数据卷容器 二、容器操作2.1 端口映射2.2 容器互联&#xff08;使用centos镜像&#xff09;2.3 Docker 镜像的创建2.3.1 基于已有镜像创建2.3.2 基于本地模板创建2.3.3 基于Dockerfile创建2.3.3.1 联合文件系统&#xff08;Unio…

【项目 进程5】 2.10 进程间通信简介 2.11匿名管道概述 2.12父子进程通过匿名管道通信

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 2.10 进程间通信简介(IPC iner process communication)Linux进程间通信的方式&#xff08;记&#xff09; 2.11匿名管道概述匿名管道管道的特点&#xff08;记&…

第一天 运维高级 MySQL备份与还原

1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) );CREATE TABLE score ( id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO…

a-tree 实现父级节点禁用,通过子级节点勾选状态控制

a-tree 组件实现折叠选择&#xff1b;使其父级节点禁用&#xff0c;通过子级节点的勾选状态来控制是否勾选&#xff1b;如果子级节点勾选任一个&#xff0c;父级节点就勾选中&#xff0c;如果子级节点全部不勾选则父节点不勾选&#xff0c;否则勾选 &#xff0c;效果如下&#…

Vue中TodoList案例_总结

完整项目&#xff1a; App.vue <template><div id"root"><div class"todo-container"><div class"todo-wrap"><MyHeader :addTodo"addTodo"/><MyList :todos"todos" :checkTodo"che…