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

Có 1 bài cũng khá hay, các thím tham khảo thử
https://leetcode.com/problems/trapping-rain-water/
Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it can trap after raining.
Ý tưởng sơ bộ: Nhìn hình và output, mình nghĩ ngay tới vét cạn binary (left = 0, right = length - 1)
Moá cuối cùng cũng làm xong cái bài này :(=((, mất đúng nửa ngày luôn
Ý tưởng: Binary vét cạn left = 0, right = length - 1
Có 2 trường hợp cần xét:
height [ left ] - height [ right ] <= 0 mực nước sẽ bằng container có height bé hơn, ++left ,mực nước sẽ bằng height
, ngược lại sẽ bằng --right
Lưu lại biến cả 2 trường hợp, kiểm tra tất cả phần tử ++left mà nhỏ hơn mức hiện tại, ngược lại kiểm tra tất cả phần tử --right cho tới khi so sánh bằng với mức hiện tại
Screen Shot 2022-06-26 at 20.28.25.png
 
Moá cuối cùng cũng làm xong cái bài này :(=((, mất đúng nửa ngày luôn
Ý tưởng: Binary vét cạn left = 0, right = length - 1
Có 2 trường hợp cần xét:
height [ left ] - height [ right ] <= 0 mực nước sẽ bằng container có height bé hơn, ++left ,mực nước sẽ bằng height
, ngược lại sẽ bằng --right
Lưu lại biến cả 2 trường hợp, kiểm tra tất cả phần tử ++left mà nhỏ hơn mức hiện tại, ngược lại kiểm tra tất cả phần tử --right cho tới khi so sánh bằng với mức hiện tại
View attachment 1232162
Java lúc nào cũng runtime ảo diệu v nhỉ :v
 
Có 1 bài cũng khá hay, các thím tham khảo thử
https://leetcode.com/problems/trapping-rain-water/
Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it can trap after raining.
Ý tưởng sơ bộ: Nhìn hình và output, mình nghĩ ngay tới vét cạn binary (left = 0, right = length - 1)

Moá cuối cùng cũng làm xong cái bài này :(=((, mất đúng nửa ngày luôn
Ý tưởng: Binary vét cạn left = 0, right = length - 1
Có 2 trường hợp cần xét:
height [ left ] - height [ right ] <= 0 mực nước sẽ bằng container có height bé hơn, ++left ,mực nước sẽ bằng height
, ngược lại sẽ bằng --right
Lưu lại biến cả 2 trường hợp, kiểm tra tất cả phần tử ++left mà nhỏ hơn mức hiện tại, ngược lại kiểm tra tất cả phần tử --right cho tới khi so sánh bằng với mức hiện tại
View attachment 1232162
Ý tưởng của mình đơn giản hơn. Nước sẽ phải chảy qua 2 đầu, hoặc bên trái hoặc bên phải và lượng nước đọng lại + h luôn <= h max bên trái và bên phải. Nên chỉ cần loop 2 lần là sẽ tính được h max trái, phải tại mỗi điểm => lượng đọng lại => lượng nước cần tính.

C++:
class Solution {
public:
    int trap(vector<int>& height) {
        vector<int> trap(height.size(), 0);
        int curMax = 0;
        for (int i = 0; i < height.size(); ++i) {
            curMax = max(curMax, height[i]);
            trap[i] = curMax - height[i];
        }
        curMax = 0;
        int ret = 0;
        for (int i = height.size() - 1; i >= 0; --i) {
            curMax = max(curMax, height[i]);
            ret += min(curMax - height[i], trap[i]);
        }
        return ret;
    }
};
 
Ý tưởng của mình đơn giản hơn. Nước sẽ phải chảy qua 2 đầu, hoặc bên trái hoặc bên phải và lượng nước đọng lại + h luôn <= h max bên trái và bên phải. Nên chỉ cần loop 2 lần là sẽ tính được h max trái, phải tại mỗi điểm => lượng đọng lại => lượng nước cần tính.

C++:
class Solution {
public:
    int trap(vector<int>& height) {
        vector<int> trap(height.size(), 0);
        int curMax = 0;
        for (int i = 0; i < height.size(); ++i) {
            curMax = max(curMax, height[i]);
            trap[i] = curMax - height[i];
        }
        curMax = 0;
        int ret = 0;
        for (int i = height.size() - 1; i >= 0; --i) {
            curMax = max(curMax, height[i]);
            ret += min(curMax - height[i], trap[i]);
        }
        return ret;
    }
};
🍻 ngon thím ơi
 
Đúng rồi, chả hiểu, lúc thì 99%, lúc thì 72%, chạy lại thì còn có 30% :confused:, nhiều lúc k biết cải thiện ntn hay là code mình ngu mà tìm quài chưa thấy chỗ cải thiện =((, hoang mang vãi
C++ em cũng thế đây, làm bài mãi ko xong mà mỗi lần chạy nó lại random ra thời gian chạy khác nhau.
 
27/6/2022:
  • 1 bài khá xàm lol
  • Vì số n là tổng các số nhị phân nên cứ mỗi lần ta giảm 1 đơn vị cho 1 chữ số, nếu là chữ số 0 thì ko giảm -> mỗi lần giảm sẽ tạo đc 1 số nhị phân, giảm cho đến khi ra số 0 -> số lần giảm ít nhất là chữ số lớn nhất
  • VD: số "5213"
"5241" -> "4130" + "1111"
"4130" -> "3010" + "1110"
"3010" -> "2000"+ "1010"
"2000"-> "1000" +"1000"
"1000"-> "0000" +"1000"
 
Bài hôm nay mức độ Medium nên cũng sợ sợ không dám submit, ai dè submit 1 phát ăn luôn
osCpCsi.png


C#:
public class Solution {
    public int MinPartitions(string n) {
        char max = '0';
        foreach (char c in n)
            if (c > max)
                max = c;
        return max - '0';
    }
}
 
27/6/2022:
  • 1 bài khá xàm lol
  • Vì số n là tổng các số nhị phân nên cứ mỗi lần ta giảm 1 đơn vị cho 1 chữ số, nếu là chữ số 0 thì ko giảm -> mỗi lần giảm sẽ tạo đc 1 số nhị phân, giảm cho đến khi ra số 0 -> số lần giảm ít nhất là chữ số lớn nhất
  • VD: số "5213"
"5241" -> "4130" + "1111"
"4130" -> "3010" + "1110"
"3010" -> "2000"+ "1010"
"2000"-> "1000" +"1000"
"1000"-> "0000" +"1000"
Bài này nó tricky đoạn đó thôi mà.
https://leetcode.com/submissions/detail/732154052/
Cùng 1 code submit mấy lần thì lần này có run time tốt nhất
 
Bài để medium mà ko nghĩ nó dễ vậy làm cứ sợ bị trap
Cứ cộng liên tục dãy số "1...1" đến khi nào đạt bằng số của đề thì đổi thành 0. Vậy số nào lớn nhất trong dãy sẽ phải cộng nhiều nhất. Trả về số đó là ra kết quả.
C#:
    public int MinPartitions(string n) {
        int result = n[0] - 48;
        for(int i = 1; i < n.Length; i++){
            if(n[i] - 48 > result){
                result = n[i] - 48;
            }
        }
        return result;
    }
 
Bài hôm nay cũng 1 dòng là đủ.

C++:
class Solution {
public:
    int minPartitions(string n) {
        return *std::max_element(begin(n), end(n)) - '0';
    }
};
 
Có 1 bài cũng trick tương tự như bài hôm nay nè, tôi đánh giá khá hay, nếu đem đi PV có thể test ứng viên từ mức độ dễ nâng dần đến mức độ khó
https://leetcode.com/problems/remove-palindromic-subsequences/

Mặc dù bài này Easy, các thím có thể mở rộng ra:
  • Nếu chuỗi s có 3 ký tự a, b, c
  • Nếu chuỗi s có 4 ký tự a, b, c, d
  • Néu chuỗi s có K ký tự a, b, c, d, ..., k
 
Có 1 bài cũng trick tương tự như bài hôm nay nè, tôi đánh giá khá hay, nếu đem đi PV có thể test ứng viên từ mức độ dễ nâng dần đến mức độ khó
https://leetcode.com/problems/remove-palindromic-subsequences/

Mặc dù bài này Easy, các thím có thể mở rộng ra:
  • Nếu chuỗi s có 3 ký tự a, b, c
  • Nếu chuỗi s có 4 ký tự a, b, c, d
  • Néu chuỗi s có K ký tự a, b, c, d, ..., k
cái not contiguous subsequence chí mạng thật, đọc hồi mới ngẫm ra :sad::beat_brick:
 
Back
Top