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

news/2024/10/18 10:16:38/

目录

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 mainimport "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 mainimport "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 mainimport "fmt"type NumArray struct {tree []intn    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)/2leftNode, rightNode := node*2, node*2+1buildTree(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] = valreturn}mid := start + (end-start)/2leftNode, rightNode := node*2, node*2+1if 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)/2leftSum := 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.ppmy.cn/news/494553.html

相关文章

如何使用众安科技智能化运维管理平台提高企业效率

数字化时代企业对于运维管理的需求越来越迫切。传统的手动运维方式已经无法满足企业对高效、可靠的运维管理的需求。众安科技作为一家科技公司&#xff0c;提供智能化运维管理平台&#xff0c;为企业提供全面的运维解决方案。本文将详细介绍如何使用众安科技智能化运维管理平台…

旧手机进水了,显示手机低温无法充电

拆开观察&#xff0c;副板和主板上面没有明显进水。只是电池插座那里有点印记。擦干净晾干还是不行。电池掉电到关机。后面再仔细观察&#xff0c;没想到&#xff0c;电池插头居然都生盐卤了。擦干净还不行。又擦了一次&#xff0c;因为确信是温度检测线造成的低温提示。第二次…

【碎碎念1】进水手机恢复+补办身份证+写安卓作业

进水手机恢复 昨天下午手机进水了&#xff0c;因为我很迅速&#xff0c;一掉进去我就立马捞了出来&#xff0c;水只没过了手机的一半。当时没事&#xff0c;都能正常使用&#xff0c;我擦了擦就没管了。晚上吃饭前给手机充上了电&#xff0c;吃完饭回来一看&#xff0c;一点都…

7X用计算机USB口充电好吗,用插排的USB口充电伤手机吗?

如今智能手机的普及也让USB接口得到统一&#xff0c;不光手机&#xff0c;包括很多的设备也都统一的使用USB接口作为连接充电器的接口。USB接口的统一也衍生另外一个生活工具&#xff0c;那就是USB插排。不需要充电器就可以给手机等设备充电的功能极大的方便了用户的使用。然而…

苹果手机数据线充不了电_手机充不了电怎么办

人们使用手机的频率是越来越高了&#xff0c;手机使用的多了&#xff0c;其充电的次数也相应的而增加了&#xff0c;一般人是一天充一次电。那么&#xff0c;手机充不了电怎么办&#xff1f;下面将会为大家介绍。 手机充不了电怎么办 一、很有可能是位于手机底部的充电接口进入…

手机充电你充对了吗?这四种情况下不建议给手机充电,原因很简单

互联网时代下的我们&#xff0c;吃穿住行都离不开手机&#xff0c;于是给手机充电就成了每天都要去做的事&#xff0c;那么&#xff0c;如果你在给手机充电时&#xff0c;遇到以下情况&#xff0c;手机维修工程师建议暂停充电&#xff1a; 1.手机严重发烫 手机在充电的过程中本…

手机和计算机错误怎么办,手机、电脑进水了要怎么办?三种常见错误!绝大多数人都这么干!...

原标题&#xff1a;手机、电脑进水了要怎么办&#xff1f;三种常见错误&#xff01;绝大多数人都这么干&#xff01; 手机与电脑逐渐成为了我们生活中不可或缺的电子产品&#xff0c;我们在使用的过程中&#xff0c;难免会出现一些意外&#xff0c;比如撞击、碰摔、进水等等。对…

java实现手机充电_android手机的充电情况监视

当手机电量有变化&#xff0c;或者有充电情况的时候&#xff0c;android会自动的发送一个广播&#xff0c;要监视充电情况&#xff0c;只需截获这个广播就ok啦&#xff01; /** * 先声明一个 IntentFilter 对象 */ private IntentFilter mIntentFilter; public void onCreate…