LeetCode(304 二维区域检索)

该博客探讨了解决LeetCode第304题的方法,通过避免双重循环,利用动态规划和缓存思想提高效率。博主指出,直接双重循环会导致效率低下,不符合中等难度题目的要求。解决方案是计算每个子矩阵的和并存储在缓存中,以减少重复计算,从而达到优化的目的。
摘要由CSDN通过智能技术生成

如题在这里插入图片描述
一眼看上去最直观的做法就是双重循环求值了

static int[][] data;
	
	public static void NumMatrix(int[][] matrix) {
        data=matrix;
    }
	
	 public static int sumRegion(int row1, int col1, int row2, int col2) {
		 int sum=0;
		 for(int m=row1;m<=row2;m++) {
			 for(int n=col1;n<=col2;n++) {
				 sum+=data[m][n];
			 }
		 }
	   return sum;
	 }

提交到leetcode对应的删除所有static修饰符。结果不出意外,要是这么简单怎么会是中等的题目在这里插入图片描述
运用缓存的思想来解,即对应的(x,y)(m,n)区域和SUM=sum(m,n)-sum(m,y-1)-sum(x,n-1)+sum(x-1,y-1)。对应的sum为对应矩阵的元素和,那我们就缓存这个对应位置的sum

public static void NumMatrix1(int[][] matrix) {
		 if(matrix==null||matrix.length==0||matrix[0]==null||matrix[0].length==0) {
			 return ;	//必不可少的退出  应对恶心的边界判断 null 及{{}}
		 } 
	     int [][]da = new int[matrix.length][matrix[0].length];  //注意必须得新建后传给data
		 da[0][0]=matrix[0][0];		//分类处理 
		 for(int i =1;i<matrix.length;i++) {
			 da[i][0]=da[i-1][0]+matrix[i][0];
		 }
		 for(int i =1;i<matrix[0].length;i++) {
			 da[0][i]=da[0][i-1]+matrix[0][i];
		 }
		 for(int m=1;m<matrix.length;m++) {
	    	 for(int n=1;n<matrix[0].length;n++) {
	    		 da[m][n]=da[m-1][n]+da[m][n-1]-da[m-1][n-1]+matrix[m][n];
	    	 }
	     }
		 data =da;
	 }
	 
	 public static int sumRegion1(int row1, int col1, int row2, int col2) { 
		 if(data==null) {  //对应前面的边界处理
			 return 0;
		 }
		 int sum=0;
		 if(row1==0&&col1==0) {  //应对边界情况的特殊判断
			 sum=data[row2][col2];
		 }else if(row1==0) {
			 sum=data[row2][col2]-data[row2][col1-1];
		 }else if(col1==0) {
			 sum=data[row2][col2]-data[row1-1][col2];
		 }else {
			 sum=data[row2][col2]-data[row1-1][col2]-data[row2][col1-1]+data[row1-1][col1-1];
		 }
		 
		 return sum;
	 }

应该算是动态规划吧,对于缓存数组同样的是相同的思路里计算,结果很理想在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值