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

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

欢迎关注公众号“三戒纪元”

题目

给定一个整数数组 nums,处理以下类型的多个查询:

  1. 计算索引 leftright (包含 leftright)之间的 nums 元素的 ,其中 left <= right

实现 NumArray 类:

  • NumArray(int[] nums) 使用数组 nums 初始化对象
  • int sumRange(int i, int j) 返回数组 nums 中索引 leftright 之间的元素的 总和 ,包含 leftright 两点(也就是 nums[left] + nums[left + 1] + ... + nums[right] )

示例 1:

输入:
["NumArray", "sumRange", "sumRange", "sumRange"]
[[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]]
输出:
[null, 1, -1, -3]解释:
NumArray numArray = new NumArray([-2, 0, 3, -5, 2, -1]);
numArray.sumRange(0, 2); // return 1 ((-2) + 0 + 3)
numArray.sumRange(2, 5); // return -1 (3 + (-5) + 2 + (-1)) 
numArray.sumRange(0, 5); // return -3 ((-2) + 0 + 3 + (-5) + 2 + (-1))

提示:

  • 1 <= nums.length <= 104
  • -105 <= nums[i] <= 105
  • 0 <= i <= j < nums.length
  • 最多调用 104sumRange 方法

我的解法

因为这题需要随时能够通过左右区间,取到区间的和,所以在数组初始化的时候,就得计算区间值了。每个位置上存储前面N位的和,这样计算左右区间时,只需要两个区间对应的和相减即可。

class NumArray {
public:NumArray(vector<int>& nums) {int sum = 0;size_t count = nums.size();for(size_t i = 0; i < count; ++i) {sum += nums[i];sums.push_back(sum);}}int sumRange(int left, int right) {if(left == 0) {return sums[right];} else {return sums[right] - sums[left - 1];}}vector<int> sums;
};/*** Your NumArray object will be instantiated and called as such:* NumArray* obj = new NumArray(nums);* int param_1 = obj->sumRange(left,right);*/

解法2

还有“踏九州”网友使用C++ acculate累加的。

class NumArray {
public:NumArray(vector<int>& nums) {this->vec = nums;}int sumRange(int left, int right) {return accumulate(vec.begin() + left, vec.begin() + right + 1, 0);}private:vector<int> vec;
};

应用(labuladong)

班上有若⼲同学,每个同学有⼀个期末考试的成绩(满分100 分),那么请你实现⼀个 API ,输⼊任意⼀个分数段,返回有多少同学的成绩在这个分数段内。

那么,你可以先通过计数排序的⽅式计算每个分数具体有多少个同学,然后利⽤前缀和技巧来实现分数段查询的 API :

int[] scores; // 存储所有同学的分数
//试卷满分100分
int[] count = new int[100 + 1]
// 记录每个分数有⼏个同学
for (int score : scores)
count[score]++
// 构造前缀和
for (int i = 1; i < count.length; i++)count[i] = count[i] + count[i-1];//利⽤count这个前缀和数组进⾏分数段查询

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

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

相关文章

2023年中国研究生数学建模竞赛赛题浅析

为了更好的帮助大家第一天选题&#xff0c;这里首先为大家带来各个赛题的赛题浅析&#xff0c;分析对应赛题之后做题阶段可能会遇到的各种难点。 稍后会带来D题的详细解析思路&#xff0c;以及相关的其他版本解题思路 成品论文等资料。 赛题难度评估&#xff1a;A、B>C>…

大数据学习1.3-xShell配置jdk

1.创建java文件 mkdir /usr/local/java 2.切换到java中 cd /user/local/java/ 3.将jdk直接拖到xShell中 4.解压jdk tar -zxvf jdk-8u221-linux-x64.tar.gz 5.配置环境变量-进入环境变量文件 vi /etc/profile 6.添加如下内容 JAVA_HOME/usr/local/java/jdk1.8.0_221 CLASSP…

云原生:构建现代化应用的新篇章

云原生&#xff1a;构建现代化应用的新篇章 随着技术的快速发展&#xff0c;我们进入了一个全新的数字化时代。在这个时代&#xff0c;云原生作为一种新兴的技术趋势&#xff0c;正逐渐改变着我们对构建现代化应用的认识。云原生是容器、微服务、DevOps、持续交付等技术的集合…

Java中List转字符串的方法

一、使用String.join方法 在Java 8之后&#xff0c;String类增加了一个静态方法join()&#xff0c;可以方便地将列表中的元素连接成字符串。 // 创建List List<String> list Arrays.asList("Google", "Baidu", "Taobao"); // 以逗号分隔…

代码随想录算法训练营19期第59天

503.下一个更大元素II 代码随想录 初步思路&#xff1a;拼接两个一摸一样的数组&#xff0c;再使用单调栈的方法 总结&#xff1a;更高效的方法是在遍历的过程中模拟走了两边数组 dp [-1] * len(nums)stack []for i in range(len(nums)*2):while(len(stack) ! 0 and num…

[效率提升]使用shell脚本完成一些git操作

[效率提升]使用shell脚本完成一些git操作 根据分支名自动Add和Commit并Push到远程开发分支 例如开发分支名为: feature-xxx功能 Commit信息为&#xff1a;xxx功能 #!/bin/bash# 获取当前分支名称 current_branch$(git rev-parse --abbrev-ref HEAD)echo "current bran…

《Python等级考试(1~6级)历届真题解析》专栏总目录

❤️ 专栏名称&#xff1a;《Python等级考试&#xff08;1~6级&#xff09;历届真题解析》 &#x1f338; 专栏介绍&#xff1a;中国电子学会《全国青少年软件编程等级考试》Python编程&#xff08;1~6级&#xff09;历届真题解析。 &#x1f680; 订阅专栏&#xff1a;订阅后可…

ThinkPHP5,使用unionAll取出两个毫无相关字段表的数据且分页

一&#xff1a;首先来了解一下 union 和 unionAll 1&#xff1a;取结果的并集&#xff0c;是否去重 union&#xff1a;对两个结果集进行并集操作&#xff0c;不包括重复行&#xff0c;相当于distinct&#xff0c;同时进行默认规则的排序&#xff1b; unionAll&#xff1a;对两…

linux 数据恢复

Linux误删除及误格式化的数据恢复方案针对的文件系统&#xff1a; 1 、基于EXT2/EXT3/EXT4文件系统 &#xff1b; 2 、基于Reiserfs文件系统&#xff1b; 3 、基于Xfs文件系统。 Linux误删除及误格式化的数据恢复解决方案&#xff1a; 一、故障检测&#xff1a; 1、检测是…

Cesium 问题:二三维切换矩形区域展示不够完整

文章目录 问题分析 问题 设置影响图层覆盖范围时&#xff0c;出现三维和二维切换后展示不够完整的情况&#xff0c; Cesium.Rectangle.fromDegrees(-180, -90, 180, 90)创建的矩形区域&#xff0c;按理说是已经设置了全覆盖&#xff0c;但切换二维后并不全覆盖 例如 三维下 切换…

Redis缓存与从数据取数据性能比较

Redis缓存与从数据取数据性能比较 为什么使用Redis 使用Redis缓存数据有多个原因&#xff0c;包括提高性能、降低数据库负载、减少响应时间和支持临时数据存储等。以下是一些主要原因以及Redis缓存的工作原理和好处&#xff1a; 1. 提高性能&#xff1a; 数据库查询通常是一…

睿趣科技:抖音开一家网店大概什么时候回本

随着移动互联网的迅猛发展&#xff0c;社交媒体平台如抖音成为了商家推广产品和服务的热门渠道之一。许多人都希望能够通过在抖音上宣传自己的产品&#xff0c;甚至考虑开一家网店&#xff0c;但回本的时间是一个关键问题。本文将探讨抖音开一家网店大概什么时候回本的问题。 首…

Ubuntu系统下载及安装教程

史上最全最新Ubuntu安装教程&#xff08;图文&#xff09; - 知乎 (说明&#xff1a;本教程介绍的是安装DeskTop版的系统) 1.官网下载镜像 官方网址: https://ubuntu.com/#download进入官网后会有最新版本的镜像下载地址&#xff0c;如果需要下载最新版本&#xff0c;直接点…

Git_06_创建分支/查看分支

创建分支 # 创建分支的同时&#xff0c;切换到该分支上 > git checkout -b 分支名称 # > git push origin 分支名称查看分支 # 查看本地分支 > git branch # 查看远程分支 > git branch -r # 查看所有分支 > git branch -a删除分支 # 删除本地分支 > git …

js同级弹窗实现数据传输修改

window.postMessage 是一种用于实现跨窗口通信的 HTML5 特性。它允许在不同窗口或 iframe 之间安全地传递数据&#xff0c;即使这些窗口来自不同的域名。 window.postMessage 方法接受两个参数&#xff1a; message&#xff1a;要发送的消息&#xff0c;可以是一个字符串或一…

为何学linux及用处

目前企业使用的操作系统无非就是国产类的&#xff0c;windows和linux类。我们要提升自己的技能&#xff0c;需要学习这两款。我记得在大学时期&#xff0c;学习过windows以及linux&#xff0c;但当时觉得又不常用&#xff0c;就学的模棱两可。毕业之后&#xff0c;你会发现&…

分布式应用之监控平台zabbix的认识与搭建

一、监控系统的相关知识 1.1 监控系统运用的原因 当我们需要实时关注与其相关的各项指标是否正常&#xff0c;往往存在着很多的服务器、网络设备等硬件资源&#xff0c;如果我们想要能够更加方便的、集中的监控他们&#xff0c;zabix可以实现集中监控管理的应用程序 监控的…

在Anaconda中安装xgboost(简单高效)

文章目录 一、检查二、打开Anaconda Prompt三、安装四、验证 一、检查 前提条件&#xff1a;windows环境下&#xff0c;anaconda&#xff08;这里指的是Anaconda3&#xff09;已安装&#xff0c;相应的numpy和sicpy也已安装。如果未安装需要先安装这两个库。 二、打开Anaconda…

RapidSSL的便宜单域名https证书

RapidSSL是Geotrust https证书品牌中的一款入门级https证书品牌&#xff0c;目前属于Digicert的子品牌。它是一款提供高性价比和广泛适用范围的https证书&#xff0c;无论是个人还是企业用户都可以轻松申请并快速验证。今天就随SSL盾小编了解RapidSSL旗下的单域名https证书。 …

Redis分布式锁的实现方式、实现原理

目录 一、分布式锁的重要性与挑战1.1 分布式系统中的并发问题竞态条件数据不一致死锁 二、分布式锁的基本原理与实现方式2.1 分布式锁的基本概念2.2 基于数据库的分布式锁原理与实现方式优缺点 2.3 基于缓存的分布式锁原理与实现方式优缺点 三、Redis分布式锁的实现与使用3.1 使…