简单的Java题,希望写一下代码哈

凑字数66666666666666666666666666666666666666666

img



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