thảo luận Leetcode mỗi ngày

  • Người tạo chủ đề Người tạo chủ đề _Gia_Cat_Luong_
  • Ngày bắt đầu Ngày bắt đầu
Trạng thái
Không mở để trả lời thêm.
nhớ đã từng làm 2 câu matrix spiral đi 1 lượt 4 chiều ntn r mà nhỉ, làm qua r như không thôi. chả nhớ gì sất :cry: dạo này implement dfs nhiều quá mới quen tay làm direction v, 10 daily thì hết 5 câu dfs r
meoqQpA.png
Đúng r, hoặc chỉ cần maintain 1 direction rồi nhân với ma trận xoay cũng được, dễ hiểu hơn ngồi mò mechanism của spiral
meoqQpA.png
Đỡ phải code nhiều giống @freedom.9 nữa.
 
Sửa lần cuối:
điểm danh cái lào :ah:
Java:
class Solution {
    public int[][] spiralMatrix(int m, int n, ListNode head) {
        int[][] matrix = new int[m][n];
        int[][] direction = new int[][]{{0,1},{1,0},{0,-1},{-1,0}};
        int[] size = new int[]{n,m-1};
        int x = 0;
        int y = -1;
        int index = 0;
        for(int[] mat:matrix)
            Arrays.fill(mat,-1);
        ListNode node = head;
        while(node!=null){
            for(int[] d:direction){
                int k = size[index];
                for(int i = 0;i<k && node!=null;i++){
                    x+=d[0];
                    y+=d[1];   
                    matrix[x][y] = node.val;                               
                    node = node.next;
                }
                size[index]--;
                index = (index+1)%2;
            }           
        }
        return matrix;
    }
}
 
Bài hôm nay để thi xem ai code ngắn hơn, :ah:
C++:
class Solution {
public:
    vector<vector<int>> spiralMatrix(int m, int n, ListNode* head) {
        vector<vector<int>> ret(m, vector<int>(n, -1));
        array<pair<int, int>, 4> adj = {make_pair(0,1), make_pair(1,0), make_pair(0,-1), make_pair(-1,0) };
        for (int i = 0, j = 0, x = 0, y = 1, dir = 0; head != nullptr; i += x, j += y, head = head->next) {
            ret[i][j] = head->val;
            int next_x = i + x, next_y = j + y;
            if (next_x < 0 || next_x >= m || next_y < 0 || next_y >= n || ret[next_x][next_y] != -1) {
                dir = (dir + 1)%4;
                std::tie(x, y) = adj[dir];
            }
        }
        return ret;
    }
};
 
Bài Q3 vừa rồi bị trap suy nghĩ theo lối mòn dp do cái công thức nó cho.
HR4W6DU.png
Nhìn tụi nó giải đơn giản vl, sao mình không nghĩ được theo hướng đó nhỉ
 
Bài Q3 vừa rồi bị trap suy nghĩ theo lối mòn dp do cái công thức nó cho.
HR4W6DU.png
Nhìn tụi nó giải đơn giản vl, sao mình không nghĩ được theo hướng đó nhỉ
Lúc mới nhìn vào t cũng nghĩ là dùng dp, nhẩm sơ thì thấy TC = O(n^2). Mà nhìn vào constraint là 10^5 thì k AC đc với TC => có cách tốt hơn. Rồi đọc kỹ, coi kỹ lại example là thấy cách O(n)
 
Lúc mới nhìn vào t cũng nghĩ là dùng dp, nhẩm sơ thì thấy TC = O(n^2). Mà nhìn vào constraint là 10^5 thì k AC đc với TC => có cách tốt hơn. Rồi đọc kỹ, coi kỹ lại example là thấy cách O(n)
Khổ nỗi là lúc biết có cách O(n) thì vẫn nghĩ theo hướng optimize cái O(n^2) ban đầu chứ không nghĩ hướng mới
Nk1Lh3K.png
 
C++:
class Solution {
public:
    vector<vector<int>> spiralMatrix(int m, int n, ListNode* head) {
        
        vector<vector<int>> ans(m, vector<int>(n, -1));
        vector<vector<int>> directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        int mode = 0;

        int col = 0, row = 0;

        while (head) {
            ans[row][col] = head->val;
            head = head->next;

            int nextRow = row + directions[mode][0];
            int nextCol = col + directions[mode][1];

            if (nextRow >= m || nextRow < 0 || nextCol >= n || nextCol < 0 || ans[nextRow][nextCol] != -1) {
                mode = (mode + 1) % 4;
                nextRow = row + directions[mode][0];
                nextCol = col + directions[mode][1];
            }

            row = nextRow;
            col = nextCol;
        }

        return ans;
    }
};
 
Lúc mới nhìn vào t cũng nghĩ là dùng dp, nhẩm sơ thì thấy TC = O(n^2). Mà nhìn vào constraint là 10^5 thì k AC đc với TC => có cách tốt hơn. Rồi đọc kỹ, coi kỹ lại example là thấy cách O(n)
bác nhẩm dc cả dp luôn ấy hả. e toàn phải viết ra dc cả bài r mới tính dc TC. skill issue chênh cỡ này thì bao h mới dc gia nhập 3Q gang
MLDzEJp.png
 
Mấy bài spiral matrix này ghét vl :rolleyes:
C#:
public class Solution
{
    public int[][] SpiralMatrix(int m, int n, ListNode head)
    {
        int[][] result = new int[m][];
        for (int row = 0; row < m; row++)
        {
            result[row] = new int[n];
            for (int col = 0; col < n; col++)
            {
                result[row][col] = -1;
            }
        }

        int[][] dirs = { [0, 1], [1, 0], [0, -1], [-1, 0] };
        
        int dirIndex = 0;
        int[] coord = [0, -1];

        int remain = m * n;
        bool horTravel = true;
        m--;
        while (true)
        {
            int count = horTravel ? n : m;
            int[] dir = dirs[dirIndex];
            for (int i = 0; i < count; i++)
            {
                coord[0] += dir[0];
                coord[1] += dir[1];
                result[coord[0]][coord[1]] = head == null ? -1 : head.val;
                remain--;
                head = head.next;
                if (remain == 0 || head == null)
                {
                    goto Result;
                }
            }
            if (horTravel)
                n--;
            else
                m--;
            horTravel = !horTravel;
            dirIndex = (dirIndex + 1) % 4;
        }

        Result:
        return result;
    }
}
 
bác nhẩm dc cả dp luôn ấy hả. e toàn phải viết ra dc cả bài r mới tính dc TC. skill issue chênh cỡ này thì bao h mới dc gia nhập 3Q gang
MLDzEJp.png
Nhẩm nhanh đc mà. Nếu làm dp thì bài toán con là tính cái max score tại 1 index bất kì, có n index => n bài toán con. Mỗi bài toán con thì nó lại có 1 vòng for để nhảy từ index đó đến những index còn lại nữa, cái này lại có TC = n nữa => tổng hợp lại thì TC=n*n = n^2.
Nhẩm trong 1 nốt nhạc ấy mà, :beauty:
 
Lúc mới nhìn vào t cũng nghĩ là dùng dp, nhẩm sơ thì thấy TC = O(n^2). Mà nhìn vào constraint là 10^5 thì k AC đc với TC => có cách tốt hơn. Rồi đọc kỹ, coi kỹ lại example là thấy cách O(n)
Bài này ban đầu đọc constraint là nghĩ ngay On hoặc cùng lắm NlogN rồi, nhanh nhanh apply ngay cái bottom up giống mấy bài jump game code đẹp vl rồi, pass hết mấy cái testcase mẫu hý hửng tưởng ngon submit tạch =)) ngồi quay lại dfs + memoi thì On2 đù má TLE cay, xong xem cái solution éo nghĩ đến greedy.
 
Bài này ban đầu đọc constraint là nghĩ ngay On hoặc cùng lắm NlogN rồi, nhanh nhanh apply ngay cái bottom up giống mấy bài jump game code đẹp vl rồi, pass hết mấy cái testcase mẫu hý hửng tưởng ngon submit tạch :LOL: ngồi quay lại dfs + memoi thì On2 đù má TLE cay, xong xem cái solution éo nghĩ đến greedy.
em cũng mới bác ơi, ý e là xếp nó vào hard thì hơi sai chứ nhiều bài medium khó lòi kèn ra mà bài kia để hard ^^
trình bác khủng thế này mà bảo mới á
KAUdgHo.png
Giả heo ăn thịt heo rồi
 
Trạng thái
Không mở để trả lời thêm.

Thống kê chủ đề

Ngày tạo
_Gia_Cat_Luong_,
Người trả lời cuối
Vipluckystar,
Trả lời
17.755
Lượt xem
1.213.998
Quay lại
Lên đầu trang