zoukankan      html  css  js  c++  java
  • [leetcode]304Range Sum Query 2D

    303一维数组的升级版,方法就是用二维数组res存下从(0,0)到当前位置的sum,存的方法是动态规划,看着二维数组画圈比较好搞清楚其中的加减法

    算子数组的sum的时候也是和存差不多的逻辑,就是某一部分加上另一部分,然后减去某一部分,逻辑画画圈就能看出来

    比价重要的是动态规划存数的过程,以后二维数组问题应该会经常用

    package com.DynamicProgramming;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * Given a 2D matrix matrix,
     * find the sum of the elements inside the rectangle defined by its upper left corner (row1, col1) and lower right corner (row2, col2).
     * Example:
     Given matrix = [
     [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]
     ]
    
     sumRegion(2, 1, 4, 3) -> 8
     sumRegion(1, 1, 2, 2) -> 11
     sumRegion(1, 2, 2, 4) -> 12
     Note:
     You may assume that the matrix does not change.
     There are many calls to sumRegion function.
     You may assume that row1 ≤ row2 and col1 ≤ col2.
     */
    public class Q304RangeSumQuery2D_Immutable {
        /**
         * Your NumMatrix object will be instantiated and called as such:
         * NumMatrix obj = new NumMatrix(matrix);
         * int param_1 = obj.sumRegion(row1,col1,row2,col2);
         */
        class NumMatrix {
            int[][] data;
            public NumMatrix(int[][] matrix) {
                if (matrix.length == 0)
                    return;
                int m = matrix.length;
                int n = matrix[0].length;
                 data = new int[m][n];
                //初始条件1
                data[0][0] = matrix[0][0];
                //初始条件2,同时也是动态规划1
                for (int i = 1; i < m; i++) {
                    data[i][0] = data[i-1][0] + matrix[i][0];
                }
                for (int i = 1; i < n; i++) {
                    data[0][i] = data[0][i-1] + matrix[0][i];
                }
                //记录从当前位置到(0,0)点的sum,动态规划2
                for (int i = 1; i < m; i++) {
                    for (int j = 1; j < n; j++) {
                        data[i][j] = data[i-1][j] + data[i][j-1] - data[i-1][j-1] + matrix[i][j];
                    }
                }
            }
    
            public int sumRegion(int row1, int col1, int row2, int col2) {
                int res = data[row2][col2];
                if (col1 >= 1 && row1 >= 1)
                {
                    res  = res - data[row2][col1-1] - data[row1-1][col2] + data[row1-1][col1-1];
                }
                else if (col1 >= 1)
                    res -= data[row2][col1-1];
                else if (row1 >= 1)
                    res -= data[row1-1][col2];
                return res;
            }
        }
    
    
    }
  • 相关阅读:
    [转] Akka实战:构建REST风格的微服务
    [转] Node.js的线程和进程
    [转] Spring Integration 系统集成
    NodeJS使用SSL证书
    Tomcat SSL证书安装配置
    [转]【NODE】用WS模块创建加密的WS服务(WSS)
    [转] Spring Boot实战之Filter实现使用JWT进行接口认证
    [转] 前后端分离之JWT用户认证
    [转] 使用 Java8 Optional 的正确姿势
    [转] SpringBoot RESTful 应用中的异常处理小结
  • 原文地址:https://www.cnblogs.com/stAr-1/p/7580614.html
Copyright © 2011-2022 走看看