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;
}