Golang每日一练(leetDay0103) 区域和检索1~3 Range Sum Query

news2024/6/30 23:46:05

目录

303. 区域和检索 - 数组不可变 Range Sum Query Immutable  🌟

304. 二维区域和检索 - 矩阵不可变 Range Sum Query 2d Immutable  🌟🌟

307. 区域和检索 - 数组可修改 Range Sum Query Mutable  🌟🌟

🌟 每日一练刷题专栏 🌟

Rust每日一练 专栏

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


303. 区域和检索 - 数组不可变 Range Sum Query Immutable

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

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

实现 NumArray 类:

  • NumArray(int[] nums) 使用数组 nums 初始化对象
  • int sumRange(int i, int j) 返回数组 nums 中索引 left 和 right 之间的元素的 总和 ,包含 left 和 right 两点(也就是 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 <= 10^4
  • -10^5 <= nums[i] <= 10^5
  • 0 <= i <= j < nums.length
  • 最多调用 10^4 次 sumRange 方法

代码:

package main

import "fmt"

type NumArray struct {
	prefixSum []int
}

func Constructor(nums []int) NumArray {
	n := len(nums)
	prefixSum := make([]int, n+1)
	for i := 0; i < n; i++ {
		prefixSum[i+1] = prefixSum[i] + nums[i]
	}
	return NumArray{prefixSum}
}

func (this *NumArray) SumRange(left int, right int) int {
	// 返回区间和
	return this.prefixSum[right+1] - this.prefixSum[left]
}

func main() {
	nums := []int{-2, 0, 3, -5, 2, -1}
	obj := Constructor(nums)
	fmt.Println(obj.SumRange(0, 2))
	fmt.Println(obj.SumRange(2, 5))
	fmt.Println(obj.SumRange(0, 5))
}

输出:

1
-1
-3


304. 二维区域和检索 - 矩阵不可变 Range Sum Query 2d Immutable

给定一个二维矩阵 matrix,以下类型的多个请求:

  • 计算其子矩形范围内元素的总和,该子矩阵的 左上角 为 (row1, col1) ,右下角 为 (row2, col2) 。

实现 NumMatrix 类:

  • NumMatrix(int[][] matrix) 给定整数矩阵 matrix 进行初始化
  • int sumRegion(int row1, int col1, int row2, int col2) 返回 左上角 (row1, col1) 、右下角 (row2, col2) 所描述的子矩阵的元素 总和 。

示例 1:

输入: 
["NumMatrix","sumRegion","sumRegion","sumRegion"]
[[[[3,0,1,4,2],[5,6,3,2,1],[1,2,0,1,5],[4,1,0,1,7],[1,0,3,0,5]]],[2,1,4,3],[1,1,2,2],[1,2,2,4]]
输出: 
[null, 8, 11, 12]

解释:
NumMatrix numMatrix = new NumMatrix([[3,0,1,4,2],[5,6,3,2,1],[1,2,0,1,5],[4,1,0,1,7],[1,0,3,0,5]]);
numMatrix.sumRegion(2, 1, 4, 3); // return 8 (红色矩形框的元素总和)
numMatrix.sumRegion(1, 1, 2, 2); // return 11 (绿色矩形框的元素总和)
numMatrix.sumRegion(1, 2, 2, 4); // return 12 (蓝色矩形框的元素总和)

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 200
  • -10^5 <= matrix[i][j] <= 10^5
  • 0 <= row1 <= row2 < m
  • 0 <= col1 <= col2 < n
  • 最多调用 10^4 次 sumRegion 方法

代码:

package main

import "fmt"

type NumMatrix struct {
	prefixSum [][]int
}

func Constructor(matrix [][]int) NumMatrix {
	m, n := len(matrix), len(matrix[0])
	prefixSum := make([][]int, m+1)

	for i := range prefixSum {
		prefixSum[i] = make([]int, n+1)
	}

	for i := 1; i <= m; i++ {
		for j := 1; j <= n; j++ {
			prefixSum[i][j] = matrix[i-1][j-1] + prefixSum[i][j-1] + prefixSum[i-1][j] - prefixSum[i-1][j-1]
		}
	}

	return NumMatrix{prefixSum}
}

func (this *NumMatrix) SumRegion(row1 int, col1 int, row2 int, col2 int) int {
	return this.prefixSum[row2+1][col2+1] - this.prefixSum[row2+1][col1] - this.prefixSum[row1][col2+1] + this.prefixSum[row1][col1]
}

func main() {
	numMatrix := [][]int{
		{3, 0, 1, 4, 2},
		{5, 6, 3, 2, 1},
		{1, 2, 0, 1, 5},
		{4, 1, 0, 1, 7},
		{1, 0, 3, 0, 5}}
	obj := Constructor(numMatrix)
	fmt.Println(obj.SumRegion(2, 1, 4, 3))
	fmt.Println(obj.SumRegion(1, 1, 2, 2))
	fmt.Println(obj.SumRegion(1, 2, 2, 4))
}

输出:

8
11
12


307. 区域和检索 - 数组可修改 Range Sum Query Mutable

给你一个数组 nums ,请你完成两类查询。

  1. 其中一类查询要求 更新 数组 nums 下标对应的值
  2. 另一类查询要求返回数组 nums 中索引 left 和索引 right 之间( 包含 )的nums元素的  ,其中 left <= right

实现 NumArray 类:

  • NumArray(int[] nums) 用整数数组 nums 初始化对象
  • void update(int index, int val) 将 nums[index] 的值 更新 为 val
  • int sumRange(int left, int right) 返回数组 nums 中索引 left 和索引 right 之间( 包含 )的nums元素的  (即,nums[left] + nums[left + 1], ..., nums[right]

示例 1:

输入:
["NumArray", "sumRange", "update", "sumRange"]
[[[1, 3, 5]], [0, 2], [1, 2], [0, 2]]
输出:
[null, 9, null, 8]

解释:
NumArray numArray = new NumArray([1, 3, 5]);
numArray.sumRange(0, 2); // 返回 1 + 3 + 5 = 9
numArray.update(1, 2);   // nums = [1,2,5]
numArray.sumRange(0, 2); // 返回 1 + 2 + 5 = 8

提示:

  • 1 <= nums.length <= 3 * 10^4
  • -100 <= nums[i] <= 100
  • 0 <= index < nums.length
  • -100 <= val <= 100
  • 0 <= left <= right < nums.length
  • 调用 update 和 sumRange 方法次数不大于 3 * 10^4 

代码:

package main

import "fmt"

type NumArray struct {
	tree []int
	n    int
}

func Constructor(nums []int) NumArray {
	n := len(nums)
	tree := make([]int, n*4)
	if n > 0 {
		buildTree(tree, nums, 1, 0, n-1)
	}
	return NumArray{tree, n}
}

func buildTree(tree []int, nums []int, node, start, end int) {
	if start == end {
		tree[node] = nums[start]
		return
	}

	mid := start + (end-start)/2
	leftNode, rightNode := node*2, node*2+1

	buildTree(tree, nums, leftNode, start, mid)
	buildTree(tree, nums, rightNode, mid+1, end)

	tree[node] = tree[leftNode] + tree[rightNode]
}

func (this *NumArray) Update(index int, val int) {
	updateTree(this.tree, 1, 0, this.n-1, index, val)
}

func updateTree(tree []int, node, start, end, index, val int) {
	if start == end {
		tree[node] = val
		return
	}

	mid := start + (end-start)/2
	leftNode, rightNode := node*2, node*2+1

	if index <= mid {
		updateTree(tree, leftNode, start, mid, index, val)
	} else {
		updateTree(tree, rightNode, mid+1, end, index, val)
	}

	tree[node] = tree[leftNode] + tree[rightNode]
}

func (this *NumArray) SumRange(left int, right int) int {
	return queryTree(this.tree, 1, 0, this.n-1, left, right)
}

func queryTree(tree []int, node, start, end, left, right int) int {
	if start > right || end < left {
		return 0
	}

	if start >= left && end <= right {
		return tree[node]
	}

	mid := start + (end-start)/2
	leftSum := queryTree(tree, node*2, start, mid, left, right)
	rightSum := queryTree(tree, node*2+1, mid+1, end, left, right)

	return leftSum + rightSum
}

func main() {
	numArray := []int{1, 3, 5}
	obj := Constructor(numArray)
	fmt.Println(obj.SumRange(0, 2))
	obj.Update(1, 2)
	fmt.Println(obj.SumRange(0, 2))
}

输出:

9
8


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/ 

Rust每日一练 专栏

(2023.5.16~)更新中...

Golang每日一练 专栏

(2023.3.11~)更新中...

Python每日一练 专栏

(2023.2.18~2023.5.18)暂停更

C/C++每日一练 专栏

(2023.2.18~2023.5.18)暂停更

Java每日一练 专栏

(2023.3.11~2023.5.18)暂停更

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

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

相关文章

kali配置静态IP地址

修改网络配置 执行命令&#xff1a; vim /etc/network/interfaces 文件末尾添加如下内容&#xff1a; auto eth0 iface eth0 inet static address 192.168.133.66 netmask 255.255.255.0 gateway 192.168.133.2其中&#xff0c;iface eth0 inet static 指配置eth0使用静态ip…

chatgpt赋能python:Python数据建模:从数据预处理到机器学习建模

Python数据建模&#xff1a;从数据预处理到机器学习建模 Python已经成为了数据建模与分析的主要工具之一&#xff0c;因为它的语法简单易懂&#xff0c;有许多数据科学库可以使用&#xff0c;支持各种各样的数据预处理和建模技术。在本文中&#xff0c;我们将重点介绍使用Pyth…

十五周算法训练营——普通动态规划(下)

今天是十五周算法训练营的第十二周&#xff0c;主要讲普通动态规划&#xff08;下&#xff09;专题。&#xff08;欢迎加入十五周算法训练营&#xff0c;与小伙伴一起卷算法&#xff09; 最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。…

基于Java网上医院预约挂号系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

Java:不支持发行版本5

错误 Java&#xff1a;不支持发行版本5 详细错误 同学在github上找到一个微服务项目&#xff08;基于maven进行构建&#xff09;&#xff0c;进行二开&#xff0c;导入项目运行控制台报错 Java&#xff1a;不支持发行版本5&#xff0c;笔者修改项目结构&#xff08; F i l e…

chatgpt赋能python:使用Python自动备份数据库

使用Python自动备份数据库 数据库是企业中非常重要的组成部分&#xff0c;里面存储着大量的数据和业务逻辑。为了避免数据库丢失或损坏可能带来的灾难性后果&#xff0c;我们通常需要定期备份数据库。而使用Python自动备份数据库是一种快捷高效的方式&#xff0c;今天我们将介…

基于Java助学贷款系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

chatgpt赋能python:Python数据库备份脚本

Python数据库备份脚本 数据库备份是保障数据安全的重要手段。Python作为一种简单易学、高效稳定的编程语言&#xff0c;被广泛应用于数据库备份脚本的编写。本文将介绍如何使用Python编写一个简单的数据库备份脚本。 准备工作 在开始编写脚本之前&#xff0c;需要安装Python…

读发布!设计与部署稳定的分布式系统(第2版)笔记07_线程阻塞

1. 通过增加复杂性解决一个问题&#xff0c;会产生全新系统失效方式的风险 2. 多线程技术使应用程序服务器具有足够的容量扩展能力&#xff0c;来满足Web上最大站点的需求 2.1. 产生并发错误的可能性 3. 服务器的进程正在运行 3.1. 并不能帮助用户完成工作 3.2. 模拟客户端…

RK3588平台开发系列讲解(导读篇)旗舰芯片RK3588介绍

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、 视频了解二、特性说明三、性能比较沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍旗舰芯片RK3588。 自瑞芯微RK3588最初的发布时间已经过去了两年多,如今RK3588终于进入了落地阶段,搭载RK3…

电脑添加夏普(sharp)打印机 从磁盘安装驱动过程

今天打算连实验室的打印机&#xff0c;是夏普的&#xff0c;但是我不知道具体的型号。不过有一个word文档说明怎么连&#xff0c;大概率需要自己下载驱动&#xff0c;下面就开始吧&#xff01; 控制面板的操作 前面都是一样的&#xff0c;控制面板–>设备和打印机–>添…

Oracle-高版本SQL优化分析(bind mismatch)

背景: 接到用户报障说一套Oracle19c数据库近期出现insert语句执行变慢的情况&#xff0c;执行一次数据插入需要1秒的时间&#xff0c;而且问题发生的数据库是跑在一体机上面&#xff0c;数据插入正常不应该这么慢&#xff0c;需要分析插入慢的原因 问题: 数据库近期出现insert…

chatgpt赋能python:使用Python绘制散点图:了解基本语法,数据可视化。

使用Python绘制散点图&#xff1a;了解基本语法&#xff0c;数据可视化。 数据是任何研究的基石&#xff0c;因此对于从事各种数据处理工作的人员来说&#xff0c;数据可视化是一个非常重要的工具。Python作为一种非常受欢迎的编程语言&#xff0c;具有广泛的应用&#xff0c;…

centos7虚拟机安装

提前创建好一个非系统盘的文件路径&#xff0c;存放centos虚拟机的系统文件 下载centos 7 centos-7-isos-x86_64安装包下载_开源镜像站-阿里云 (aliyun.com) 先创建新的虚拟机 点击下一步 点击下一步 点击下一步 选择Linux(L)和CentOS 7 64位&#xff0c;然后点击下一步 位置…

编译原理笔记5:从正规式到词法分析器(2):NFA 记号识别、确定化、并行算法、子集法构造DFA

目录 NFA 识别记号的并行方法NFA 上识别记号的确定化方法状态集 T 的 ε-闭包(T)ε-闭包算法 NFA 并行算法NFA 并行算法例&#xff1a;识别 abb 和 abab 从 NFA 到 DFA&#xff08;子集法构造 DFA &#xff09; NFA 识别记号的并行方法 之前的文章中写过的 “用一个输入字符串…

【八大排序(八)】归并排序高阶篇-非递归版

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:八大排序专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习排序知识   &#x1f51d;&#x1f51d; 归并非递归版 1. 前情回顾2. 归并非递归基…

JVM的内容

0、Java基础考点 1、谈谈你对Java的理解 平台无关性(一次编译&#xff0c;到处运行)GC(垃圾清理)语言特性(泛型、反射)面向对象(封装、继承、多态)类库异常处理 2、Java是如何实现平台无关性的(一处编译&#xff0c;到处运行) 编译时&#xff08;语法和语义进行检测&#xf…

0012-TIPS-pawnyable : Use-After-Free

原文 Linux Kernel PWN | 040203 Pawnyable之UAF https://pawnyable.cafe/linux-kernel/LK01/use_after_free.html 题目下载 漏洞代码 #include <linux/module.h> #include <linux/kernel.h> #include <linux/cdev.h> #include <linux/fs.h> #includ…

【踩坑】Windows11安装WSL2,然后装miniconda

Windows11安装WSL2 跟着官方文档一步步来就完事了&#xff0c;你要在vscode上用还是用docker都有教程微软WSL文档 遇到问题 Installing, this may take a few minutes… WslRegisterDistribution failed with error: 0x80370102 Please enable the Virtual Machine Platform W…

chatgpt赋能python:Python收费怎么办?

Python收费怎么办&#xff1f; Python是一门非常流行的编程语言&#xff0c;特别是在数据科学和机器学习领域中。许多人使用Python来编写自己的应用程序和脚本&#xff0c;但是有些人会对Python的收费问题感到困惑。本文将介绍Python的收费情况以及如何解决这个问题。 Python…