thảo luận Leetcode contest, đường tới Guardian

bài này vẽ hình chia case siêu dễ, chẳng cần nghĩ vẹo gì, nhìn theo hình để code. :sweat:
Lúc đầu em nghĩ ác lắm, 10ph sau ngồi vẽ hình ra code 20ph là xong:sweat:
Thi xong bác guide ae cách nháp với :ah:
Mình hầu như ko biết cách nháp nó ra =((
 
1719113807144.png


done, 3Q đầu k ăn bọ, Q4 thì ăn vài con, :p
 
Thiếu 4 phút để hoàn thiện Q4 :( Bỏ cuộc quá sớm, vì thấy các bác làm thì mới làm tiếp theo ý tưởng duyệt trâu ban đầu.

Java:
class Solution {
    public int[] minimumArea(int[][] grid, int li, int ri, int lj, int rj) {
        int minI = grid.length, maxI = -1;
        int minJ = grid[0].length, maxJ = -1;
        int count = 0;
      
        for (int i = li; i <= ri; i++) {
            for (int j = lj; j <= rj; j++) {
                if (grid[i][j] == 1) {
                    minI = Math.min(minI, i);
                    maxI = Math.max(maxI, i);
                    minJ = Math.min(minJ, j);
                    maxJ = Math.max(maxJ, j);
                    count++;
                }
            }
        }
        return new int[]{minI, maxI, minJ, maxJ, count};
    }
    int calArea(int[] area) {
        return (area[1]-area[0]+1)*(area[3]-area[2]+1);
    }
  
    public int minimumSum(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
      
        int[] bound = minimumArea(grid, 0, m-1, 0, n-1);
        int minI = bound[0];
        int maxI = bound[1];
        int minJ = bound[2];
        int maxJ = bound[3];
        int count = bound[4];
        int ans = Integer.MAX_VALUE;
      
        for (int i = minI; i < maxI; i++) {
            var area1 = minimumArea(grid, minI, i, minJ, maxJ);
            if (area1[4] >= count-1) {
                continue;
            }
            for (int ii = i+1; ii < maxI; ii++) {
                var area2 = minimumArea(grid, i+1, ii, minJ, maxJ);
                if (area1[4] + area2[4] >= count) {
                    continue;
                }
                var area3 = minimumArea(grid, ii+1, maxI, minJ, maxJ);
                ans = Math.min(ans, calArea(area1) + calArea(area2) + calArea(area3));
            }
            for (int j = minJ; j < maxJ; j++) {
                var area2 = minimumArea(grid, i+1, maxI, minJ, j);
                if (area1[4] + area2[4] >= count) {
                    continue;
                }
                var area3 = minimumArea(grid, i+1, maxI, j+1, maxJ);
                ans = Math.min(ans, calArea(area1) + calArea(area2) + calArea(area3));
            }
        }
        for (int i = minI+1; i <= maxI; i++) {
            var area1 = minimumArea(grid, i, maxI, minJ, maxJ);
            if (area1[4] >= count-1) {
                continue;
            }
            for (int j = minJ; j < maxJ; j++) {
                var area2 = minimumArea(grid, minI, i-1, minJ, j);
                if (area1[4] + area2[4] >= count) {
                    continue;
                }
                var area3 = minimumArea(grid, minI, i-1, j+1, maxJ);
                ans = Math.min(ans, calArea(area1) + calArea(area2) + calArea(area3));
            }
        }
      
        for (int j = minJ; j < maxJ; j++) {
            var area1 = minimumArea(grid, minI, maxI, minJ, j);
            if (area1[4] >= count-1) {
                continue;
            }
            for (int jj = j+1; jj < maxJ; jj++) {
                var area2 = minimumArea(grid, minI, maxI, j+1, jj);
                if (area1[4] + area2[4] >= count) {
                    continue;
                }
                var area3 = minimumArea(grid, minI, maxI, jj+1, maxJ);
                ans = Math.min(ans, calArea(area1) + calArea(area2) + calArea(area3));
            }
            for (int i = minI; i < maxI; i++) {
                var area2 = minimumArea(grid, minI, i, j+1, maxJ);
                if (area1[4] + area2[4] >= count) {
                    continue;
                }
                var area3 = minimumArea(grid, i+1, maxI, j+1, maxJ);
                ans = Math.min(ans, calArea(area1) + calArea(area2) + calArea(area3));
            }
        }
        for (int j = minJ+1; j <= maxJ; j++) {
            var area1 = minimumArea(grid, minI, maxI, j, maxJ);
            if (area1[4] >= count-1) {
                continue;
            }
            for (int i = minI; i < maxI; i++) {
                var area2 = minimumArea(grid, minI, i, minJ, j-1);
                if (area1[4] + area2[4] >= count) {
                    continue;
                }
                var area3 = minimumArea(grid, i+1, maxI, minJ, j-1);
                ans = Math.min(ans, calArea(area1) + calArea(area2) + calArea(area3));
            }
        }
        return ans;
    }
}
 
Mấy bác cho e hỏi tầm rank 900-1500 thì gần guardian nó có cộng k mấy bác, em làm contest thường trong khoảng rank này. Giờ rating e tầm 2k hơn xíu tính hè cày cho trâu hẳn r đánh contest tiếp với dạo này cũng bận thi cử quá :LOL:
 
Mấy bác cho e hỏi tầm rank 900-1500 thì gần guardian nó có cộng k mấy bác, em làm contest thường trong khoảng rank này. Giờ rating e tầm 2k hơn xíu tính hè cày cho trâu hẳn r đánh contest tiếp với dạo này cũng bận thi cử quá :LOL:
ko nhé bác, mới check ac thằng bạn guardian rank 1k2 , rating 2k2 ko biến đổi gì lắm
zFNuZTA.png

1719147173971.png
 
Back
Top