21/03/02刷题记录Day11

304. 二维区域和检索 - 矩阵不可变

给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2) 。
在这里插入图片描述
上图子矩阵左上角 (row1, col1) = (2, 1) ,右下角(row2, col2) = (4, 3),该子矩形内元素的总和为 8。

思路1

这个题比较简单,只用设置一个全局变量即可

完整代码1

public class NumMatrix {
	private int[][] nums;
	public NumMatrix(int[][] matrix) {
		this.nums = matrix;

    }
    
    public int sumRegion(int row1, int col1, int row2, int col2) {
    	int sum = 0;
    	for(int i = row1; i <= row2; i++) {
    		for(int j = col1; j <= col2; j++) {
    			sum += nums[i][j];
    		}
    	}
    	return sum;

    }

}

在这里插入图片描述

思路2

1.基于昨天所做的区域检索,一维数组解题是利用了前缀和,这里的话是二维的矩阵,尝试用前缀和做。
2.得到面积的递推公式:
S[row2][col2]−S[row2][col1−1]−S[row1−1][col2]+S[row1−1][col1−1]
3.“做这种初始化一次、检索多次的题目的秘诀:在初始化的时候做预处理”。

错误

在提交的时候因为把sums = new int[m + 1][n + 1],写成了sums = new int[matrix.length + 1][matrix[0] + 1],导致报错

完整代码

int[][] sums;

	    public NumMatrix(int[][] matrix) {
	        if(matrix.length == 0 || matrix[0].length == 0) {
	        	return;
	        }
	        int m = matrix.length;
	        int n = matrix[0].length;
	        sums = new int[m + 1][n + 1];
	        for (int i = 0; i < m; i++) {
	        	for (int j = 0; j < n; j++) {
	        		sums[i + 1][j + 1] = sums[i][j + 1] + sums[i + 1][j] - sums[i][j] + matrix[i][j];
	              }
	         }
	    }
	    
	    public int sumRegion(int row1, int col1, int row2, int col2) {
	        return sums[row2 + 1][col2 + 1] - sums[row1][col2 + 1] - sums[row2 + 1][col1] + sums[row1][col1];
	    }

在这里插入图片描述

14. 最长公共前缀

思路

1.求最长公共前缀。因为所有的字符串的前缀都是一致的,只是不知道大小。
2.我们设第一个字符串为前缀,和第二个字符串进行比较,找到不相等的索引位置,截取相等的部分。再将相等的部分与第三个字符串比较,进行同样的操作。

语法

在java中的两种截取字符串的方法:

1.substr 方法

返回一个从指定位置开始的指定长度的子字符串。stringvar.substr(start [, length ])

2.substring 方法

返回位于 String 对象中指定位置的子字符串。
strVariable.substring(start, end)
“String Literal”.substring(start, end)
该方法不包含end索引位置字符,如果start是负数则会被认为是0,start和end两者中较小者会被认为是起点。

完整代码

public String longestCommonPrefix(String[] strs) {
        if(strs.length == 0 || strs == null) {
			return "";
		}
		String ans = strs[0];
		for(int i = 1; i < strs.length; i++) {
			int k = 0;
			while(k < ans.length() && k < strs[i].length()) {
				if(ans.charAt(k) == strs[i].charAt(k)) {
					k++;
				}else {
					break;
				}
			}
			ans = ans.substring(0, k);
		}
		return ans;

    }

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42180334/article/details/114280265