凑字数66666666666666666666666666666666666666666
public class Main {
public boolean test(int[][] arr, int line, int column){
//记录遍历到每个位置的时候,最大的相同数
int[][] temp = new int[line][column];
temp[0][0] = 1;//最小是1
//2层循环,遍历整个二维数组
for (int i=0;i<line;++i){
for (int j=0;j<column;++j){
//topV leftV 当前位置的上边和下边最大数量
int topV = i > 0 ? temp[i-1][j] : 0;
int leftV = j > 0 ? temp[i][j-1] : 0;
//当前位置上边和左边的数组的值
int top = i > 0 ? arr[i-1][j] : -1;
int left = j > 0 ? arr[i][j-1] : -1;
//如果当前位置和上左都一样,那么取最大的
if(arr[i][j] == top && arr[i][j] == left){
temp[i][j] = Math.max(topV, leftV) +1;
}else if(arr[i][j] == top){
temp[i][j] = topV+1;
}else if (arr[i][j] == left){
temp[i][j] = leftV +1;
}else {
temp[i][j] = 1;
}
//如果已经右3个一样了,就不循环了,直接返回true
if(temp[i][j] == 3){
return true;
}
}
}
return false;
}
public static void main(String[] args) {
int[][] a = new int[][]{{4,4,1,4},{2,2,1,2},{2,2,1,2},{3,1,3,1}};
System.out.println(new Main().test(a, 4,4));
}
}
最坏情况需要遍历1次数组,时间复杂度是O(MN), 空间复杂度也是MN
说明:用一维数组来做解释
比如数组: 1 2 2 3 3 3
遍历数组,下标为0,最大重复数为1,
下标1,2 !=1 ,最大重复数也是1
到下标2的时候, 2 等于前一个2,那么用前一个的最大重复数1,加上1 就是2。
因此,循环之后,得到一个新数组 1 1 2 1 2 3