讨论/题目交流/🏆 第 162 场力扣周赛/
🏆 第 162 场力扣周赛

欢迎小伙伴们在这里交流分享你的参赛心得以及体验。【前往竞赛

image.png

3 分 - 奇数值单元格的数目
4 分 - 重构 2 行二进制矩阵
5 分 - 统计封闭岛屿的数目
6 分 - 得分最高的单词集合

本菜鸡的三道解答
第一题 统计变化次数为奇数的行和奇数的列的个数xnum和ynum,再计算结果

class Solution {
    public int oddCells(int n, int m, int[][] indices) {
       int result=0;
        int xnum = 0;
        int ynum=0;
        int[] x=new int[n];
        int[] y = new int[m];
        for(int i=0;i<indices.length;i++){
             x[indices[i][0]] = x[indices[i][0]]^1;
             y[indices[i][1]] = y[indices[i][1]]^1;
        }
        for(int i=0;i<x.length;i++){
            if(x[i]==1){
                xnum++;
            }
        }
        for(int i=0;i<y.length;i++){
            if(y[i]==1){
                ynum++;
            }
        }
        result = n*ynum+m*xnum-2*xnum*ynum;
        return result;
    }
}

第二题 排除upper-lower大于colsums中1的个数和upperupper+lowerlower与colcolsum不相等两种情况,然后upper比lower大多少就给上面分配多少个1

class Solution {
    public List<List<Integer>> reconstructMatrix(int upper, int lower, int[] colsum) {
        List<List<Integer>> result = new ArrayList();
        List<Integer> up = new ArrayList<>();
        List<Integer> lo = new ArrayList<>();
        int sum = 0;
        int cha = 0;
        for(int i=0;i<colsum.length;i++){
            if(colsum[i]==1){
                cha++;
            }
            sum = sum+colsum[i];
        }
        if(Math.abs(upper-lower)>cha||sum!=upper+lower){
            return result;
        }
        int aaa= upper-lower;
        for(int i=0;i<colsum.length;i++){
            if(colsum[i]==2){
                up.add(1);
                lo.add(1);
            } else if(colsum[i]==1){
                if(aaa>0){
                    up.add(1);
                    lo.add(0);
                    aaa--;
                } else {
                    aaa++;
                    up.add(0);
                    lo.add(1);
                }
            } else {
                up.add(0);
                lo.add(0);
            }

        }
        result.add(up);
        result.add(lo);
        return result;
    }
}

第三题
判断当前陆地是否为边界,把当前陆地置为1(边界不用置为1),进行东南西北判断,都封闭返回true,仍为陆地则以递归的方式继续判断,判断过的地区都置为1了。最后的区域list除了边界都为1

class Solution {
    public int closedIsland(int[][] grid) {
        List<List<Integer>> list = new ArrayList<>();
        int result = 0;
        for(int i=0;i<grid.length;i++){
            ArrayList<Integer> objects = new ArrayList<>();
            for (int j=0;j<grid[i].length;j++){
                objects.add(grid[i][j]);
            }
            list.add(objects);
        }
        for(int i=0;i<list.size();i++){
            for (int j=0;j<list.get(i).size();j++){
                if(list.get(i).get(j)==0){
                    if(isTrue(i,j,list)){
                        result++;
                    }
                }
            }
        }
        return result;
    }
    public static boolean isTrue(int x,int y,List<List<Integer>> grid){
        
        if(x==0||y==0||x==grid.size()-1||y==grid.get(0).size()-1) {
            return false;
        }
        grid.get(x).set(y,1);
        boolean don=false;
        boolean na=false;
        boolean xi=false;
        boolean be=false;
        if(grid.get(x-1).get(y)==1){
            be=true;
        } else {

            be= isTrue(x-1,y,grid);
        }
        if(grid.get(x+1).get(y)==1){
            na=true;
        } else {

            na= isTrue(x+1,y,grid);
        }
        if(grid.get(x).get(y-1)==1){
            xi=true;
        } else {

            xi= isTrue(x,y-1,grid);
        }
        if(grid.get(x).get(y+1)==1){
            don=true;
        } else {

            don= isTrue(x,y+1,grid);
        }
        return don&&na&&xi&&be;
    }
}
展开全部 22 讨论