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

Bạn chia sẻ cách học LC để pv các cty top tier được ko?

Để apply vào các công ty top trong ngành thôi bác

đúng Quân Sư ơi, mục tiêu của em là làm chủ được phần interview thuật toán của các công ty lớn ở Việt Nam

Bác ơi sang nước ngoài chưa. Học Leetcode trâu bò vậy mà.

Nếu mục tiêu chỉ để phỏng vấn thì có thể follow theo roadmap của những ng đã từng thành công, trong thớt này cũng có nhiều bạn chia sẻ rồi.

Roadmap mình đề xuất:

1. (1-2 ngày) Big O notation: Cái này là cực kì quan trọng khi làm LC. Phải nắm rõ và có thói quen est đc độ phức tạp của mọi thứ mình làm trong 1 nốt nhạc. Kĩ năng này cần phải luyện tập nhiều nhưng cần dành thời gian tập luyện trước cho vững rồi củng cố dần dần.

2. (14-21 ngày) Cấu trúc dữ liệu căn bản: Học 1 lượt về các cấu trúc dữ liệu căn bản, các thao tác trên CTDL đó và độ phức tạp tương ứng. Hiểu được CTDL nào thì nên dùng lúc nào với bài toán nào. Mục tiêu là làm đc 3-4 bài level super easy cho mỗi CTDL. Có thể sử dụng LC Study Plan cho phần này (https://leetcode.com/study-plan/data-structure/). CTDL căn bản gồm:
  • Mảng
  • Hashtable / Hash Map / Hash Set
  • Stack / queue
  • Linked list
  • Tree các thể loại
  • Graph các thể loại

3. (7 - 14 ngày) Thuật toán căn bản: Học các thuật toán cơ bản thường dùng, và tập phân tích độ phức tạp của mỗi chi phí. Tương tự, mục tiêu là hoàn thành đc 3-4 bài mỗi topic mức độ easy. Bao gồm:
  • Tìm kiếm nhị phân
  • Tìm kiếm tuyến tính
  • Sort: (Quick, merge, heap, count, radix)
  • Prefix sum
  • Đệ quy
  • DFS / BFS

4. (14 - 21 ngày) Đào sâu vào các CTDL nâng cao theo chuyên đề. Vẫn là CTDL nhưng làm các bài medium (5-6 bài mỗi topic) và học thêm các CTDL nâng cao hơn như Trie, Segment Tree,...

5. (21 - 30 ngày) Tương tự nhưng đào sâu vào các thuật toán nâng cao, mỗi topic làm đc 4-5 bài medium. Giai đoạn này mới thực sự là bắt đầu grinding:
  • Sliding window
  • Two pointers
  • Backtracking
  • Monotonic stack / queue
  • Math & Bitwise
  • Geometry
    • Graph algorithms
  • Dynamic programming

6. (7 - 14 ngày) Làm ngẫu nhiên. Qua bước 5 thì thím đã khá vững vàng để chiến đấu rồi, bước tiếp theo là làm ngẫu nhiên các bài level medium (hoặc hard luôn) mà không biết trước chủ đề để tập vận dụng các kiến thức linh hoạt. Mỗi ngày làm 1-3 bài liên tục tầm 1-2 tuần là đc.

7. (Vô chừng) FAANG: Hết bước 6 chỉ cho các bác vào đc cái cty top tier ở VN thôi, để vào FAANG mình nghĩ là cần phải done được các bài hard trong khoản thời gian dưới 45p. Nó khó vkl và mình cũng k chắc là làm được nên k biết chỉ sao.

Cuối cùng, đừng dành hết thời gian vào để cày LC nếu chỉ vì muốn pass phỏng vấn, vì:
  • Phỏng vấn còn rất nhiều phần khác, LC chỉ là cánh cửa đầu tiên. Nếu nói ra nó chiếm đc khoảng 30% kết quả phỏng vấn của các bác thôi.
  • Dù là thuật toán, thì cái code / solution cũng chỉ chiếm được 40% trong cái 30% đó thôi, 60% còn lại là:
    • Cách phát triển vấn đề, tư duy để tìm ra giải pháp
    • Cách code, có gọn gàng sạch đẹp không, có suy nghĩ đc các edge case k, gặp vấn đề cách debug như thế nào
    • Cách trình bày: Phải giải thích được code & ý tưởng của mình cho interviewer hiểu. Nếu không tất cả cũng vô nghĩa
  • Cuối cùng, LC chả giúp gì nhiều trong công việc thực tế, nếu sau khi pass pv xong bạn fail probation thì cũng vậy cả.
p/s: Mình vẫn ở VN, trước mắt cũng k có ý định relocate sang nc ngoài làm việc. Mình làm LC vì sở thích chứ cũng k có mục tiêu vào cty nào.
 
Last edited:
Vì bài hôm nay dễ nên mới random thêm 1 bài hard làm, đúng là chua thật, mất phải tiếng rưỡi, đủ các kiểu mới pass được:

https://leetcode.com/problems/tallest-billboard/

View attachment 1223078
theo bác luôn nhưng có vẻ thuật toán k hiệu quả bằng
1111.png
 
Nếu mục tiêu chỉ để phỏng vấn thì có thể follow theo roadmap của những ng đã từng thành công, trong thớt này cũng có nhiều bạn chia sẻ rồi.

Roadmap mình đề xuất:

1. (1-2 ngày) Big O notation: Cái này là cực kì quan trọng khi làm LC. Phải nắm rõ và có thói quen est đc độ phức tạp của mọi thứ mình làm trong 1 nốt nhạc. Kĩ năng này cần phải luyện tập nhiều nhưng cần dành thời gian tập luyện trước cho vững rồi củng cố dần dần.

2. (14-21 ngày) Cấu trúc dữ liệu căn bản: Học 1 lượt về các cấu trúc dữ liệu căn bản, các thao tác trên CTDL đó và độ phức tạp tương ứng. Hiểu được CTDL nào thì nên dùng lúc nào với bài toán nào. Mục tiêu là làm đc 3-4 bài level super easy cho mỗi CTDL. Có thể sử dụng LC Study Plan cho phần này (https://leetcode.com/study-plan/data-structure/). CTDL căn bản gồm:
  • Mảng
  • Hashtable / Hash Map / Hash Set
  • Stack / queue
  • Linked list
  • Tree các thể loại
  • Graph các thể loại

3. (7 - 14 ngày) Thuật toán căn bản: Học các thuật toán cơ bản thường dùng, và tập phân tích độ phức tạp của mỗi chi phí. Tương tự, mục tiêu là hoàn thành đc 3-4 bài mỗi topic mức độ easy. Bao gồm:
  • Tìm kiếm nhị phân
  • Tìm kiếm tuyến tính
  • Sort: (Quick, merge, heap, count, radix)
  • Prefix sum
  • Đệ quy
  • DFS / BFS

4. (14 - 21 ngày) Đào sâu vào các CTDL nâng cao theo chuyên đề. Vẫn là CTDL nhưng làm các bài medium (5-6 bài mỗi topic) và học thêm các CTDL nâng cao hơn như Trie, Segment Tree,...

5. (21 - 30 ngày) Tương tự nhưng đào sâu vào các thuật toán nâng cao, mỗi topic làm đc 4-5 bài medium. Giai đoạn này mới thực sự là bắt đầu grinding:
  • Sliding window
  • Two pointers
  • Backtracking
  • Monotonic stack / queue
  • Math & Bitwise
  • Geometry
    • Graph algorithms
  • Dynamic programming

6. (7 - 14 ngày) Làm ngẫu nhiên. Qua bước 5 thì thím đã khá vững vàng để chiến đấu rồi, bước tiếp theo là làm ngẫu nhiên các bài level medium (hoặc hard luôn) mà không biết trước chủ đề để tập vận dụng các kiến thức linh hoạt. Mỗi ngày làm 1-3 bài liên tục tầm 1-2 tuần là đc.

7. (Vô chừng) FAANG: Hết bước 6 chỉ cho các bác vào đc cái cty top tier ở VN thôi, để vào FAANG mình nghĩ là cần phải done được các bài hard trong khoản thời gian dưới 45p. Nó khó vkl và mình cũng k chắc là làm được nên k biết chỉ sao.

Cuối cùng, đừng dành hết thời gian vào để cày LC nếu chỉ vì muốn pass phỏng vấn, vì:
  • Phỏng vấn còn rất nhiều phần khác, LC chỉ là cánh cửa đầu tiên. Nếu nói ra nó chiếm đc khoảng 30% kết quả phỏng vấn của các bác thôi.
  • Dù là thuật toán, thì cái code / solution cũng chỉ chiếm được 40% trong cái 30% đó thôi, 60% còn lại là:
    • Cách phát triển vấn đề, tư duy để tìm ra giải pháp
    • Cách code, có gọn gàng sạch đẹp không, có suy nghĩ đc các edge case k, gặp vấn đề cách debug như thế nào
    • Cách trình bày: Phải giải thích được code & ý tưởng của mình cho interviewer hiểu. Nếu không tất cả cũng vô nghĩa
  • Cuối cùng, LC chả giúp gì nhiều trong công việc thực tế, nếu sau khi pass pv xong bạn fail probation thì cũng vậy cả.
p/s: Mình vẫn ở VN, trước mắt cũng k có ý định relocate sang nc ngoài làm việc. Mình làm LC vì sở thích chứ cũng k có mục tiêu vào cty nào.

Cảm ơn Quân Sư nha

Gửi từ Xiaomi 220333QAG bằng vozFApp
 
Nếu mục tiêu chỉ để phỏng vấn thì có thể follow theo roadmap của những ng đã từng thành công, trong thớt này cũng có nhiều bạn chia sẻ rồi.

Roadmap mình đề xuất:

1. (1-2 ngày) Big O notation: Cái này là cực kì quan trọng khi làm LC. Phải nắm rõ và có thói quen est đc độ phức tạp của mọi thứ mình làm trong 1 nốt nhạc. Kĩ năng này cần phải luyện tập nhiều nhưng cần dành thời gian tập luyện trước cho vững rồi củng cố dần dần.

2. (14-21 ngày) Cấu trúc dữ liệu căn bản: Học 1 lượt về các cấu trúc dữ liệu căn bản, các thao tác trên CTDL đó và độ phức tạp tương ứng. Hiểu được CTDL nào thì nên dùng lúc nào với bài toán nào. Mục tiêu là làm đc 3-4 bài level super easy cho mỗi CTDL. Có thể sử dụng LC Study Plan cho phần này (https://leetcode.com/study-plan/data-structure/). CTDL căn bản gồm:
  • Mảng
  • Hashtable / Hash Map / Hash Set
  • Stack / queue
  • Linked list
  • Tree các thể loại
  • Graph các thể loại

3. (7 - 14 ngày) Thuật toán căn bản: Học các thuật toán cơ bản thường dùng, và tập phân tích độ phức tạp của mỗi chi phí. Tương tự, mục tiêu là hoàn thành đc 3-4 bài mỗi topic mức độ easy. Bao gồm:
  • Tìm kiếm nhị phân
  • Tìm kiếm tuyến tính
  • Sort: (Quick, merge, heap, count, radix)
  • Prefix sum
  • Đệ quy
  • DFS / BFS

4. (14 - 21 ngày) Đào sâu vào các CTDL nâng cao theo chuyên đề. Vẫn là CTDL nhưng làm các bài medium (5-6 bài mỗi topic) và học thêm các CTDL nâng cao hơn như Trie, Segment Tree,...

5. (21 - 30 ngày) Tương tự nhưng đào sâu vào các thuật toán nâng cao, mỗi topic làm đc 4-5 bài medium. Giai đoạn này mới thực sự là bắt đầu grinding:
  • Sliding window
  • Two pointers
  • Backtracking
  • Monotonic stack / queue
  • Math & Bitwise
  • Geometry
    • Graph algorithms
  • Dynamic programming

6. (7 - 14 ngày) Làm ngẫu nhiên. Qua bước 5 thì thím đã khá vững vàng để chiến đấu rồi, bước tiếp theo là làm ngẫu nhiên các bài level medium (hoặc hard luôn) mà không biết trước chủ đề để tập vận dụng các kiến thức linh hoạt. Mỗi ngày làm 1-3 bài liên tục tầm 1-2 tuần là đc.

7. (Vô chừng) FAANG: Hết bước 6 chỉ cho các bác vào đc cái cty top tier ở VN thôi, để vào FAANG mình nghĩ là cần phải done được các bài hard trong khoản thời gian dưới 45p. Nó khó vkl và mình cũng k chắc là làm được nên k biết chỉ sao.

Cuối cùng, đừng dành hết thời gian vào để cày LC nếu chỉ vì muốn pass phỏng vấn, vì:
  • Phỏng vấn còn rất nhiều phần khác, LC chỉ là cánh cửa đầu tiên. Nếu nói ra nó chiếm đc khoảng 30% kết quả phỏng vấn của các bác thôi.
  • Dù là thuật toán, thì cái code / solution cũng chỉ chiếm được 40% trong cái 30% đó thôi, 60% còn lại là:
    • Cách phát triển vấn đề, tư duy để tìm ra giải pháp
    • Cách code, có gọn gàng sạch đẹp không, có suy nghĩ đc các edge case k, gặp vấn đề cách debug như thế nào
    • Cách trình bày: Phải giải thích được code & ý tưởng của mình cho interviewer hiểu. Nếu không tất cả cũng vô nghĩa
  • Cuối cùng, LC chả giúp gì nhiều trong công việc thực tế, nếu sau khi pass pv xong bạn fail probation thì cũng vậy cả.
p/s: Mình vẫn ở VN, trước mắt cũng k có ý định relocate sang nc ngoài làm việc. Mình làm LC vì sở thích chứ cũng k có mục tiêu vào cty nào.
Thanks bác đã chia sẻ
 
mấy ngày nữa thi Cấu liệu, về leetcode làm tưởng dễ mà hóa ra khoai phết.
https://leetcode.com/problems/freedom-trail/submissions/
Ý tưởng thì ai quen cũng chỉ mất vài phút là ra, quan trọng là cách cài đặt dp, sub 3 lần mới xanh nổi (30ph). Lần cuối éo nghĩ nhiều mà greedy kiểu trong string xuôi chiều kim đồng hồ và ngược chiều kim đồng hồ, thằng nào nhỏ hơn auto lấy làm gốc cho lần duyệt tiếp theo thì xanh luôn. Đúng đời, greedy đoán mò nhiều khi cũng chuẩn.
C++:
class Solution {
public:
    int findRotateSteps(string ring, string key) {
        int n=key.size();
        int u=ring.size();
        ring=ring+ring;
        int m=ring.size();
        vector<vector<int>>dp(n,vector<int>(u,INT_MAX));
        for(int i=0;i<m;i++){
            if(ring[i]==key[0]){
                dp[0][i%u]=min(dp[0][i%u],abs(u-i)+1);
            }
        }
        for(int i=1;i<n;i++){
            for(int j=0;j<m;j++){
                if(ring[j]==key[i]){
                    for(int k=j;k<m;k++){
                        if(ring[k]==key[i-1]){
                            dp[i][j%u]=min(dp[i][j%u],dp[i-1][k%u]+k-j+1);
                        }
                    }
                    for(int k=j;k>=0;k--){
                        if(ring[k]==key[i-1]){
                            dp[i][j%u]=min(dp[i][j%u],dp[i-1][k%u]+j-k+1);
                        }
                    }
                }
            }
        }
        int res=INT_MAX;
        for(int i=0;i<u;i++){
            if(ring[i]==key[n-1]) res=min(res,dp[n-1][i]);
        }
        return res;
    }
};
 
mấy ngày nữa thi Cấu liệu, về leetcode làm tưởng dễ mà hóa ra khoai phết.
https://leetcode.com/problems/freedom-trail/submissions/
Ý tưởng thì ai quen cũng chỉ mất vài phút là ra, quan trọng là cách cài đặt dp, sub 3 lần mới xanh nổi (30ph). Lần cuối éo nghĩ nhiều mà greedy kiểu trong string xuôi chiều kim đồng hồ và ngược chiều kim đồng hồ, thằng nào nhỏ hơn auto lấy làm gốc cho lần duyệt tiếp theo thì xanh luôn. Đúng đời, greedy đoán mò nhiều khi cũng chuẩn.
C++:
class Solution {
public:
    int findRotateSteps(string ring, string key) {
        int n=key.size();
        int u=ring.size();
        ring=ring+ring;
        int m=ring.size();
        vector<vector<int>>dp(n,vector<int>(u,INT_MAX));
        for(int i=0;i<m;i++){
            if(ring[i]==key[0]){
                dp[0][i%u]=min(dp[0][i%u],abs(u-i)+1);
            }
        }
        for(int i=1;i<n;i++){
            for(int j=0;j<m;j++){
                if(ring[j]==key[i]){
                    for(int k=j;k<m;k++){
                        if(ring[k]==key[i-1]){
                            dp[i][j%u]=min(dp[i][j%u],dp[i-1][k%u]+k-j+1);
                        }
                    }
                    for(int k=j;k>=0;k--){
                        if(ring[k]==key[i-1]){
                            dp[i][j%u]=min(dp[i][j%u],dp[i-1][k%u]+j-k+1);
                        }
                    }
                }
            }
        }
        int res=INT_MAX;
        for(int i=0;i<u;i++){
            if(ring[i]==key[n-1]) res=min(res,dp[n-1][i]);
        }
        return res;
    }
};

Dài dữ dội vậy nhỉ, mình code bẩn có mấy dòng :v

Python:
class Solution:
    def tallestBillboard(self, rods: List[int]) -> int:
        @cache
        def maxFrom(i, n):
            if i >= len(rods):
                return 0 if n == 0 else -1
           
            res = max(maxFrom(i + 1, n), maxFrom(i + 1, n + rods[i]))
            if maxFrom(i + 1, abs(n - rods[i])) >= 0:
                res = max(res, min(n, rods[i]) + maxFrom(i + 1, abs(n - rods[i])))
               
            return res
       
        return max(0, maxFrom(0, 0))
 
Tối hôm qua thức khuya, sáng nay lười mà thấy bài Hard nữa nên oải kèo quá các thím ơi
xjIzSG9.png


Ý tưởng sơ bộ là sort mảng theo startDate (lastDate - duration) rồi tìm mảng con tăng dài nhất, chả biết có chạy được không, tối về nhà tính.
 
mấy ngày nữa thi Cấu liệu, về leetcode làm tưởng dễ mà hóa ra khoai phết.
https://leetcode.com/problems/freedom-trail/submissions/
Ý tưởng thì ai quen cũng chỉ mất vài phút là ra, quan trọng là cách cài đặt dp, sub 3 lần mới xanh nổi (30ph). Lần cuối éo nghĩ nhiều mà greedy kiểu trong string xuôi chiều kim đồng hồ và ngược chiều kim đồng hồ, thằng nào nhỏ hơn auto lấy làm gốc cho lần duyệt tiếp theo thì xanh luôn. Đúng đời, greedy đoán mò nhiều khi cũng chuẩn.
C++:
class Solution {
public:
    int findRotateSteps(string ring, string key) {
        int n=key.size();
        int u=ring.size();
        ring=ring+ring;
        int m=ring.size();
        vector<vector<int>>dp(n,vector<int>(u,INT_MAX));
        for(int i=0;i<m;i++){
            if(ring[i]==key[0]){
                dp[0][i%u]=min(dp[0][i%u],abs(u-i)+1);
            }
        }
        for(int i=1;i<n;i++){
            for(int j=0;j<m;j++){
                if(ring[j]==key[i]){
                    for(int k=j;k<m;k++){
                        if(ring[k]==key[i-1]){
                            dp[i][j%u]=min(dp[i][j%u],dp[i-1][k%u]+k-j+1);
                        }
                    }
                    for(int k=j;k>=0;k--){
                        if(ring[k]==key[i-1]){
                            dp[i][j%u]=min(dp[i][j%u],dp[i-1][k%u]+j-k+1);
                        }
                    }
                }
            }
        }
        int res=INT_MAX;
        for(int i=0;i<u;i++){
            if(ring[i]==key[n-1]) res=min(res,dp[n-1][i]);
        }
        return res;
    }
};
là do bro nghĩ phức tạp hóa mọi thứ thôi, kp do letcode :D
 
Hành trình gian khổ thôi rồi, chúc mừng thím. Thím có thể share code / ý tưởng lên đây cho ae thẩm với đc k ?
Làm theo cái hint của bài đấy thím, mỗi lần cộng duration của khóa học vào mà bị quá thời hạn, thì bỏ 1 cái course đã chọn có duration lớn nhất ra (chỉ cần bỏ 1 thôi không cần bỏ nhiều hơn, vì bỏ ra >= 2 mà thêm vào 1 thì vô nghĩa) =>
  • Cần track các course đã chọn => dùng priority queue để dễ lấy ra cái course có duration lớn nhất
  • Cần sort lại cái mảng để chỉ cần 1 lần loop duy nhất => cái này các thím tự suy nghĩ nên sort kiểu gì.
Code thì các thím vào mục discussion tụi Ấn nó share đầy ra, nên em ko đưa code của mình chi mất công nhé. Chả phải dấu code gì đâu.
 
mình cũng cày lc, dsa, oop. Mà khổ cái pvan dạo mấy cty ở VN toàn hỏi frame work, ngôn ngữ, rồi OS, networking. Auto tạch nản quá, mà đúng là mấy cái đó chỉ có nhớ thuộc lòng mới trả lời được chứ không xài tư duy được, ôn thì quá nhiều
 
Back
Top