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

2023-09-22 12:14:26

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这个前缀和数组进⾏分数段查询
更多推荐

通讯网关软件009——利用CommGate X2MQTT实现MQTT访问ODBC数据源

本文介绍利用CommGateX2MQTT实现MQTT访问ODBC数据源。CommGateX2MQTT是宁波科安网信开发的网关软件,软件可以登录到网信智汇(http://wangxinzhihui.com)下载。【案例】如下图所示,实现上位机通过MQTT来获取ODBC数据源的数据。【解决方案】设置网关机,与ODBC数据源

2023数A题——WLAN网络信道接入机制建模

A题——WLAN网络信道接入机制建模思路:该题主要考察的WLAN下退避机制建模仿真。资料获取问题1:假设AP发送包的载荷长度为1500Bytes(1Bytes=8bits),PHY头时长为13.6μs,MAC头为30Bytes,MAC头和有效载荷采用物理层速率455.8Mbps发送。AP之间的RSSI为-70dBm。大

git和github的入门操作

之前因为工作中用的都是SVN版本控制工具,没接触过git和github,现在开始深入自学Django框架技术后,看到官网推荐使用git,然后这两天网上查阅了很多文章教程,学到入门操作需要学习的点,太多的知识点要后面慢慢深入学习了。看到一个网上教程说的一段话:“如果你是一枚Coder,但是你不知道Github,那么我觉的

深入探讨Java面试中内存泄漏:如何识别、预防和解决

引言在编写和维护Java应用程序时,内存泄漏是一个重要的问题,可能导致性能下降和不稳定性。本文将介绍内存泄漏的概念,为什么它在Java应用程序中如此重要,并明确本文的目标,即识别、预防和解决内存泄漏问题。内存泄漏的概念内存泄漏是指应用程序中分配的内存(通常是堆内存)在不再需要时未能正确释放。这些未释放的内存块会积累,最

springboot+canal+mysql+redis缓存双写一致性

canal官网地址:https://github.com/alibaba/canal/wiki/QuickStart基本上按照官网的步骤来就行准备首先服务器上要安装好jdk,因为canal运行需要jdk,同时把canal对应的端口在服务中开放,否则连接不上对于自建MySQL,需要先开启Binlog写入功能,配置binl

【面试刷题】——堆栈窗口

“堆栈窗口”(StackWindow)通常不是一个特定的编程术语,但可以用来描述在编程和计算机科学领域中一些相关的概念。这些概念涉及到堆栈(stack)和窗口(window)等术语的组合。以下是一些可能涉及到的相关概念:堆栈窗口管理(StackWindowManagement):这是一种用于管理用户界面(UI)中不同窗

【Vue】模块基本语法「上篇」

【Vue】模块基本语法「上篇」一、插值1.1文本1.2v-html1.3数据双向绑定(v-model)二、指令2.1v-if|v-else|v-else-if2.2v-show2.3v-for2.4动态参数三、过滤器3.1局部过滤器3.2全局过滤器四、计算属性&监听属性4.1计算属性4.2监听属性五、案例实操5.1购物

嵌入式MCU都有什么高级用法?

嵌入式MCU都有什么高级用法?您举的几个例子,确实是MCU外设的一些高端玩法。只是不知道您是否想过,既然这些机制是被人设计出来的,那它就是种标准用法。从微控制器的发展历程来看,许多硬件机制都是有了实际需求后才添加进来,比如接收不定长数据,最初没有超时中断的情况下只能软件实现,极大的浪费最近很多小伙伴找我,说想要一些嵌入

Vue的进阶使用--模板语法应用

目录前言一.Vue的基础语法1.插值1.1文本插值1.2HTML插值1.3属性插值1.4Vue演示三元条件运算2指令2.1if&&else指令(v-if/v-else-if/v-else)2.2v-for指令2.3v-on指令(动态参数)2.4知识点补充之v-if与v-show的区别3.过滤器3.1局部过滤器3.2全局

什么是领域驱动设计(DDD): 领域驱动设计和实践如何做

引言软件系统面向对象的设计思想可谓历史悠久,20世纪70年代的Smalltalk可以说是面向对象语言的经典,直到今天我们依然将这门语言视为面向对象语言的基础。随着编程语言和技术的发展,各种语言特性层出不穷,面向对象是大部分语言的一个基本特性,像C++、Java、C#这样的静态语言,Ruby、Python这样的动态语言都

关于物联网技术的水电厂电气开关柜测温系统设计应用

摘要:针对洪江水电厂电气开关柜温度无法在线监测的问题,本文提出了一种基于物联网技术的水电厂开关柜温度测量系统。该系统部署简单高效,能快速采集设备温度数据,通过4G或者WiFi无线信号将数据送入物联网云平台,实现开关柜温度远程实时监测,为开关柜状态诊断提供决策依据。此外,该系统解决了人工巡检成本高、数据及时率低、作业风险

热文推荐