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.
do k <= n, nên O(K + log(n)) cũng là O(n) thôi, :D. Hơn nữa dùng 2 pointer nó đơn giản,đỡ nhức đầu.

k nhỏ hơn nhiều so với n thì O(n) bất lợi. Với cách O(k) cũng chỉ 2 dùng con trỏ thôi.

xài deque O(k) mem là dỏm ròi O(1) đâu
JEWoIdl.png


chơi thêm 2 cái if cho đỡ nhức đầu
MjfezZB.png

Vừa edit, không cần phải dùng deque.
 
k nhỏ hơn nhiều so với n thì O(n) bất lợi. Với cách O(k) cũng chỉ 2 dùng con trỏ thôi.
Vừa edit, không cần phải dùng deque.
Cách của thím là search để lấy điểm ở giữa rồi mở rộng ra 2 bên. Còn cách dùng 2 pointers thì thu hẹp lại để ra được K. Nếu như K lớn, gần = n thì cách dùng 2 pointers sẽ nhanh hơn và ngược lại. Còn worst case thì 2 cách đều như nhau, đều là O(n) cả thôi. :D
 
Cách của thím là search để lấy điểm ở giữa rồi mở rộng ra 2 bên. Còn cách dùng 2 pointers thì thu hẹp lại để ra được K. Nếu như K lớn, gần = n thì cách dùng 2 pointers sẽ nhanh hơn và ngược lại. Còn worst case thì 2 cách đều như nhau, đều là O(n) cả thôi. :D

Vậy tốt nhất là so sánh k vs n/2 trước rồi chọn cách tính.
 
Bài 7. Nhập một dãy số nguyên và lưu trong một mảng. Không dùng mảng trung gian, hãy in ra dãy con tăng nghiêm ngặt có tổng giá trị các phần tử lơn nhất. VD: 1 3 2 8 10 12 7 29 6 6 3 output: 7 29

Bác có ý tưởng làm bài này không bác, mình nghĩ mãi không ra :cry:
 
Bài 7. Nhập một dãy số nguyên và lưu trong một mảng. Không dùng mảng trung gian, hãy in ra dãy con tăng nghiêm ngặt có tổng giá trị các phần tử lơn nhất. VD: 1 3 2 8 10 12 7 29 6 6 3 output: 7 29

Bác có ý tưởng làm bài này không bác, mình nghĩ mãi không ra :cry:
dãy con có các phần tử liên tục thì cứ chạy vòng for tìm hết các dãy con này là được thoy
zQU2cJa.png
 
log(n) cũng đâu chính xác, n-k kia so sánh abs() < abs() hoặc có tối ưu thì cũng là int-int < int-int thì lâu hơn 1 cái so sánh trong tìm kiếm nhị phân log(n) chỉ so sánh int < int thoy mà
Cái vụ abs thì có thể tối ưu bằng cách check thêm 2 trường hơn x >= arr.back() hoặc x <= arr.front() là đc.
 
Đoạn tính tổng thì đơn giản rồi, nhưng làm sao từ cái tổng đấy in ngược ra được cái phần tử con ấy cơ

https://www.geeksforgeeks.org/find-...Imd16ggRgrCJWtN6ZdxE409ZqRLBnuRHF8VWsa7hlMh1c
lưu 2 cái index là đc.

Solution đây. TH có nhiều đoạn có tổng là lớn nhất và bằng nhau thì sẽ return đoạn đầu tiên.
https://onlinegdb.com/ZWHli-Klr
C++:
vector<int> getMaxSubArr(const vector<int> &arr) {
    if (arr.empty()) return {};
    int start = 0, end = 0, start_tmp = 0;
    int curMax = std::numeric_limits<int>::min();
    int curSum = arr[0];
    for (int i = 1; i < arr.size(); ++i) {
        if (arr[i] > arr[i-1]) {
            curSum += arr[i];
        } else {
            if (curSum > curMax) {
                curMax = curSum;
                end = i;
                start = start_tmp;
            }
            start_tmp = i;
            curSum = arr[i];
        }
    }
    return vector<int>(arr.begin() + start, arr.begin() + end);
}
 
Đoạn tính tổng thì đơn giản rồi, nhưng làm sao từ cái tổng đấy in ngược ra được cái phần tử con ấy cơ

https://www.geeksforgeeks.org/find-...Imd16ggRgrCJWtN6ZdxE409ZqRLBnuRHF8VWsa7hlMh1c

Strict increasing thì các số trong mảng con sẽ là unique, khi thím lưu max(sum) thì lưu thêm cái item cuối cùng. Sau khi loop lần 1 để tìm max(sum) và latest_item thì loop lại 1 lần nữa quay lui để in ra mảng con.

PS: lâu lắm mới mò vào lại thớt này, anh em vẫn xôm tụ nhỉ :big_smile:
 
lưu 2 cái index là đc.

Solution đây. TH có nhiều đoạn có tổng là lớn nhất và bằng nhau thì sẽ return đoạn đầu tiên.
https://onlinegdb.com/ZWHli-Klr
C++:
vector<int> getMaxSubArr(const vector<int> &arr) {
    if (arr.empty()) return {};
    int start = 0, end = 0, start_tmp = 0;
    int curMax = std::numeric_limits<int>::min();
    int curSum = arr[0];
    for (int i = 1; i < arr.size(); ++i) {
        if (arr[i] > arr[i-1]) {
            curSum += arr[i];
        } else {
            if (curSum > curMax) {
                curMax = curSum;
                end = i;
                start = start_tmp;
            }
            start_tmp = i;
            curSum = arr[i];
        }
    }
    return vector<int>(arr.begin() + start, arr.begin() + end);
}
Strict increasing thì các số trong mảng con sẽ là unique, khi thím lưu max(sum) thì lưu thêm cái item cuối cùng. Sau khi loop lần 1 để tìm max(sum) và latest_item thì loop lại 1 lần nữa quay lui để in ra mảng con.

PS: lâu lắm mới mò vào lại thớt này, anh em vẫn xôm tụ nhỉ :big_smile:
Thank 2 bác, để e ngồi ngẫm đã
 
Nếu bài này bắt tính điểm start của chuỗi kết quả thôi thì cách binary search chỉ mất O(log n) cho mọi TH k, hiệu quả hơn nhiều so với các cách còn lại. Ngồi đọc solution 30p mới hiểu cách binary search
 
Sorry các bác em spam nhưng tại hỏi mãi không tìm được câu trả lời.

Em cũng có hỏi thầy ở trường thì thầy nói là làm bài tập thật nhiều. Vì thế em kiếm HackerRank và Leetcode.
———
Em đang học Python và thường xuyên làm bài tập trên HackerRank, Leetcode.Em đã học cơ bản Python các loại dữ liệu và cũng học C căn bản rồi. Tuy nhiên em thấy khả năng giải thuật của mình yếu quá , không biết có phải do em mới học không hay là do em đang đi sai hướng?

Em không ngại khó , hay nản , chỉ sợ đi sai hướng , rất mong các bác hướng dẫn giúp đỡ em cách học tốt hơn.

Em có thể đầu tư đi học thêm đại học, khoá học, trung tâm …vvv… miễn sao có thể có hướng đúng đắn và tiến bộ ạ.
 
Sửa lần cuố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.558
Quay lại
Lên đầu trang