当前位置: 首页 > news >正文

算法----二维区域和检索 - 矩阵不可变(Kotlin)

题目

给定一个二维矩阵 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
-105 <= matrix[i][j] <= 105
0 <= row1 <= row2 < m
0 <= col1 <= col2 < n
最多调用 104 次 sumRegion 方法

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/range-sum-query-2d-immutable
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解决思路

1.暴力
2.参考:https://leetcode.cn/problems/range-sum-query-2d-immutable/solution/ru-he-qiu-er-wei-de-qian-zhui-he-yi-ji-y-6c21/

解决方法

class NumMatrix(matrix: Array<IntArray>) {
    var matrix = matrix

    fun sumRegion(row1: Int, col1: Int, row2: Int, col2: Int): Int {
        var result = 0
        for (i in row1..row2) {
            for (j in col1..col2) {
                result += matrix[i][j]
            }
        }
        matrix
        return result
    }

}
class NumMatrix2(matrix: Array<IntArray>) {
    var sum = Array<IntArray>(matrix.size) { IntArray(matrix[0].size) { 0 } }

    init {
        for (i in matrix.indices) {
            for (j in matrix[i].indices) {
                var temp = 0
                var needShort = 0
                if (i - 1 >= 0) {
                    temp += sum[i - 1][j]
                    needShort ++
                }
                if (j - 1 >= 0) {
                    temp += sum[i][j - 1]
                    needShort ++

                }
                temp += matrix[i][j]
                if (needShort == 2){
                    temp -= sum[i-1][j-1]
                }
                sum[i][j] = temp
            }
        }
    }

    fun sumRegion(row1: Int, col1: Int, row2: Int, col2: Int): Int {
        var result = sum[row2][col2]
        if (row1 -1 >=0){
            result-=sum[row1-1][col2]
        }
        if (col1 -1 >=0){
            result-=sum[row2][col1-1]

        }
        if (row1 -1 >=0 && col1 -1 >=0){
            result+= sum[row1 -1][col1-1]
        }
        return result
    }

}
  1. 2方法的优化版本

class NumMatrix3(matrix: Array<IntArray>) {
    var sum = Array<IntArray>(matrix.size + 1) { IntArray(matrix[0].size + 1) { 0 } }

    init {
        for (i in matrix.indices) {
            for (j in matrix[i].indices) {
                sum[i + 1][j + 1] = sum[i][j + 1] + sum[i + 1][j] - sum[i][j] + matrix[i][j]
            }
        }
    }

    fun sumRegion(row1: Int, col1: Int, row2: Int, col2: Int): Int {
        return sum[row2 + 1][col2 + 1] - sum[row1][col2 + 1] - sum[row2 + 1][col1] + sum[row1][col1]
    }

}

总结

1.这道题很不错 虽然暴力在一次检索中是不慢的
但是在多次调用后就会相对来说慢了不少了
2.要留个心眼 因为那么多的i-1 j-1 还要判断是不是大于0
我们可以让数组长度变大一个 这样就不用做那些无用的判断
更整洁 更便于理解 重要的是 更加好写

相关文章:

  • 向Visual Studio Code导入ST项目
  • ES6转为ES5 AST
  • 二分法查找方法
  • UE5物体旋转(蓝图版)
  • 【网络安全】SQL注入专题讲解
  • unordered_set、unordered_map的介绍+使用+比较
  • Leetcode139. 单词拆分
  • DRM系列(9)之drm_atomic_helper_commit
  • Unity入门03——Unity脚本
  • finally执行语句的注意和小陷阱
  • 【推荐系统->论文阅读】WideDeep模型
  • 【Node】cookie、sessionStorage、localStorage 与 身份认证
  • 把setting.xml放在conf和.m2目录的区别
  • OpenCV图像加载、显示与保存
  • Vulhub靶场搭建与使用
  • C++入门教程(10):for 语句
  • CentOS从零开始部署Nodejs项目
  • JavaScript标准库系列——Math对象和Date对象(二)
  • JAVA之继承和多态
  • Laravel5.4 Queues队列学习
  • node 版本过低
  • passportjs 源码分析
  • python docx文档转html页面
  • underscore源码剖析之整体架构
  • Zsh 开发指南(第十四篇 文件读写)
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 创建一种深思熟虑的文化
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 力扣(LeetCode)965
  • 驱动程序原理
  • 入门级的git使用指北
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 在weex里面使用chart图表
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • # centos7下FFmpeg环境部署记录
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (十六)一篇文章学会Java的常用API
  • (转)我也是一只IT小小鸟
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .md即markdown文件的基本常用编写语法
  • .NET Core 成都线下面基会拉开序幕
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET Core引入性能分析引导优化
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET关于 跳过SSL中遇到的问题
  • .sh 的运行
  • /*在DataTable中更新、删除数据*/
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • [20180129]bash显示path环境变量.txt
  • [2023-年度总结]凡是过往,皆为序章
  • [AIGC] SQL中的数据添加和操作:数据类型介绍