原题:
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
Did you use extra space?
A straight forward solution using O(mn) space is probably a bad idea.
A simple improvement uses O(m + n) space, but still not the best solution.
Could you devise a constant space solution?
题意是给定一个矩阵,要求把矩阵为0元素所在行和列元素都变为0.不要用额外空间。
思考过程:
要诀在于把需要变成0的行和列标记好,最后处理。不能在中间处理,因为中间改动会不清楚哪些元素一开始值是0。
解题思路:
遍历数组,遇到值为0的元素,就把它所在行第一个元素和所在列第一个元素变为0,最后遍历第一行和第一列,改变数组。这样会出现一个问题:无法判断第一行和第一列要不要变成0。因此在遍历数组(准确说是不包括第一行和第一列的数组)之前先用两个boolean变量记录第一行和第一列是否出现过0.最后处理第一行和第一列。
AC代码:
int[][] matrix;
String word1,word2;
public int minDistance(String word1, String word2) {
this.word1 = word1;
this.word2 = word2;
int len1 = word1.length(),len2 = word2.length();
matrix = new int[len1+1][len2+1];
if (len1 == 0) return len2;
if (len2 == 0) return len1;
//下面初始化时步数多加了1,是为了以后根据矩阵元素是否为0就可以判断此元素是否计算过。最后返回结果时记得减一就可以了
matrix[0][0] = 1;
/*if (len1 == 1) return matrix[0][0] + len2 - len1;//控制某个字符串只有一个字符的情况,防止下面越界
if (len2 == 1) return matrix[0][0] + len1 - len2;
matrix[0][1] = matrix[0][0] + 1;
matrix[1][0] = matrix[0][0] + 1;*/
return findEditDistance(len1,len2) - 1;
}
/*
寻找word1前i+1个字符合word2前j+1个字符匹配最小步数
*/
public int findEditDistance(int i,int j){
if (matrix[i][j] != 0) return matrix[i][j];
int r1 = Integer.MAX_VALUE,r2 = Integer.MAX_VALUE,r3 = Integer.MAX_VALUE;
boolean b1 = i > 0,b2 = j > 0,b3 = b1 && b2;
if (b1) r1 = findEditDistance(i - 1,j) + 1;
if (b2) r2 = findEditDistance(i,j - 1) + 1;
if (b3) r3 = findEditDistance(i-1,j-1) + (word1.charAt(i-1) == word2.charAt(j-1)? 0:1);
matrix[i][j] = Math.min(r1,Math.min(r2,r3));
return matrix[i][j];
}