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

chạy đc là vui rùi, mà đc tận 94,64%, phấn khởi :love:
1656647220501.png

Python:
class Solution:
    def maximumUnits(self, boxTypes: List[List[int]], truckSize: int) -> int:
        boxTypes.sort(key=lambda x: -x[1])
        box_cnt = 0
        max_unit = 0

        for item in boxTypes:
            box_cnt += item[0]
            max_unit += item[0] * item[1]
            if box_cnt > truckSize:
                max_unit -= (box_cnt - truckSize) * item[1]
                break
                
        return max_unit
 

ngoctan_95

Senior Member
Chào tháng 7 các thím. Chúc 1 tháng đầy đặn :p
Mở hàng tháng mới với 1 bài siêu dễ nào

https://leetcode.com/problems/search-insert-position

Java:
Given a sorted array of distinct integers and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.

You must write an algorithm with O(log n) runtime complexity.
 
Chào tháng 7 các thím. Chúc 1 tháng đầy đặn :p
Mở hàng tháng mới với 1 bài siêu dễ nào

https://leetcode.com/problems/search-insert-position

Java:
Given a sorted array of distinct integers and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.

You must write an algorithm with O(log n) runtime complexity.
nói thật bài này tui phải google chứ pv gặp tui tạch, biết tên thuật toán là bs, nhưng mà ko biết implement
 

GircoBoy

Senior Member
Nay bài dễ quá thì thảo luận mấy cái ngoài lề đi các thím. Các thím hay debug test case như thế nào? Trường hợp đệ quy thì làm sao để dễ theo dõi...

Cá nhân tôi thì cứ out ra console thôi. Tôi thường ghi output 2 lần: 1 lần ở đầu hàm, 1 lần ở cuối hàm. Dựa vào đó có thể hình dung ra flow:

Code:
public void func(int a, int b, int c)
{
    Console.WriteLine("starting func($0, $1, $2)", a, b, c);
    ........
    Console.WriteLine("finished func($0, $1, $2)", a, b, c);
}

Sent from Samsung SM-A528B using vozFApp
Code trên IDE thì mình dùng IDE debug step by step, còn trên LC thì mình cũng out console, có mấy bài graph phức tạp hơn phải dùng DFS thì lâu lâu phải vẽ ra giấy :D

Cá nhân mình code C++ rất ngán debug những cái Runtime Error như vầy, phải xoá từng block code để biết mình bị tràn số hay code ngu từ đâu =((

1656651150168.png
 

_Gia_Cat_Luong_

Senior Member
Code trên IDE thì mình dùng IDE debug step by step, còn trên LC thì mình cũng out console, có mấy bài graph phức tạp hơn phải dùng DFS thì lâu lâu phải vẽ ra giấy :D

Cá nhân mình code C++ rất ngán debug những cái Runtime Error như vầy, phải xoá từng block code để biết mình bị tràn số hay code ngu từ đâu =((

View attachment 1240923
Nhìn cái error nhoẵn hết cả não

via theNEXTvoz for iPhone
 

ngoctan_95

Senior Member
Code trên IDE thì mình dùng IDE debug step by step, còn trên LC thì mình cũng out console, có mấy bài graph phức tạp hơn phải dùng DFS thì lâu lâu phải vẽ ra giấy :D

Cá nhân mình code C++ rất ngán debug những cái Runtime Error như vầy, phải xoá từng block code để biết mình bị tràn số hay code ngu từ đâu =((

View attachment 1240923
Nhìn cái error này chắc mình sẽ quyết định tắt máy ngủ 15p xong dậy tìm solution khác :big_smile::big_smile::big_smile:
 

bribnt

Đã tốn tiền
Nhìn cái error nhoẵn hết cả não

via theNEXTvoz for iPhone
Error dễ hiểu mà:

  • lỗi heap-use-after-free --> đã free / delete bộ nhớ rồi nhưng vẫn dùng lại
  • Có thông tin về cả address xảy ra lỗi. pc program counter là address của lệnh bị lỗi, bp base pointer là address base của stack frame hiện tại.

Nếu như build ở chế độ debug thì nó còn có thể hiện được cả dòng code nào lỗi dựa vào các thông tin trên.

Ở đây LC nó bật cờ AddressSanitize nên mới biết là có lỗi đấy. Còn nếu không bật thì hoặc là sẽ cho qua luôn đọc được giá trị rác, hoặc là bị seg fault nhưng không biết tại sao.
 
Code trên IDE thì mình dùng IDE debug step by step, còn trên LC thì mình cũng out console, có mấy bài graph phức tạp hơn phải dùng DFS thì lâu lâu phải vẽ ra giấy :D

Cá nhân mình code C++ rất ngán debug những cái Runtime Error như vầy, phải xoá từng block code để biết mình bị tràn số hay code ngu từ đâu =((

View attachment 1240923
Nhiu đây nhằm nhò gì. Đi làm gặp mấy con bug kiểu lâu lâu mới xảy ra, gây crash mà chỉ ở production. Dưới local không bao giờ re-produce được. Lúc crash thì nó có quăng ra trace log nhưng cái trace log đó nó không trỏ vào đúng chỗ gây crash do code được build với -O2, :beat_brick:
Chỉ có cách vừa đọc code vừa cầu nguyện để tìm ra root cause, :beat_brick:
 

ngx3009

Senior Member
Mọi người ơi cho em hỏi là bài leetcode 347, tìm top K phần tử xuất hiện nhiều nhất trong một mảng. Giả sử như mình không muốn tìm top K phần tử nữa mà mình tìm mảng các phần tử có số lần xuất hiện nhiều nhất. ví dụ như [1, 2, 3, 1, 2, 4, 3] thì kết quả sẽ là [1, 2, 3].
Đây là bài giải problem 347 của em solution 347
Còn đây là bài em làm với đề bài là tìm phần tử xuất hiện nhiều nhất, nhưng em vẫn chưa xử lý được trường hợp [1, 2, 3, 1, 2, 4, 3] thì kết quả sẽ là [1, 2, 3], em mới xử lí được trường hợp [1,2,1,1,3] kết quả là [1] , Link bài giải
Mong mọi người chỉ cho em cách xử lí trường hợp có nhiều phần tử có cùng số lần xuất hiện nhiều nhất:too_sad:
 

GircoBoy

Senior Member
Mọi người ơi cho em hỏi là bài leetcode 347, tìm top K phần tử xuất hiện nhiều nhất trong một mảng. Giả sử như mình không muốn tìm top K phần tử nữa mà mình tìm mảng các phần tử có số lần xuất hiện nhiều nhất. ví dụ như [1, 2, 3, 1, 2, 4, 3] thì kết quả sẽ là [1, 2, 3].
Đây là bài giải problem 347 của em solution 347
Còn đây là bài em làm với đề bài là tìm phần tử xuất hiện nhiều nhất, nhưng em vẫn chưa xử lý được trường hợp [1, 2, 3, 1, 2, 4, 3] thì kết quả sẽ là [1, 2, 3], em mới xử lí được trường hợp [1,2,1,1,3] kết quả là [1] , Link bài giải
Mong mọi người chỉ cho em cách xử lí trường hợp có nhiều phần tử có cùng số lần xuất hiện nhiều nhất:too_sad:
Bác chỉnh lại khúc này xíu là đc
Java:
if (max_appear < current_appear){
    // Khi có một phần tử mới nhiều lần xuất hiện hơn thì cần phải xoá tất cả 
    // các phần tử cũ trong mảng kết quả (do chúng có ít lần xuất hiện hơn).
    answer.clear();
    
    answer.add(nums[i]);
    answer = nums[i];
} else if (max_appear == current_appear){
    answer.add(nums[i]);
}
Mà bài này không cần 2 vòng for lồng nhau vậy đâu, bác có thể sắp xếp lại mảng để làm thì dễ hơn nhiều.
 

Fire Of Heart

M.I.A
tayto
Có bài này cho anh em thử :)

Đi siêu thị mua gạo, có 1 dãy các túi gạo với trọng lượng khác nhau. Bạn muốn mua 1 dãy perfect sao cho cứ túi này thì bằng bình phương trọng lượng túi trước. Tìm dãy dài nhất có thể

Ví dụ: Input: 3 9 2 4 16
Dãy nhiều các thím có thể mua dc là 2 4 16 -> output = 3

Ràng buộc: Input array size = n < 10^5
trọng lượng túi gạo < 10^6

Ko có link đâu, nên các thím tự tạo test case cho pass corner case nhé :)
 

ngx3009

Senior Member
Bác chỉnh lại khúc này xíu là đc
Java:
if (max_appear < current_appear){
    // Khi có một phần tử mới nhiều lần xuất hiện hơn thì cần phải xoá tất cả 
    // các phần tử cũ trong mảng kết quả (do chúng có ít lần xuất hiện hơn).
    answer.clear();
    
    answer.add(nums[i]);
    answer = nums[i];
} else if (max_appear == current_appear){
    answer.add(nums[i]);
}
Mà bài này không cần 2 vòng for lồng nhau vậy đâu, bác có thể sắp xếp lại mảng để làm thì dễ hơn nhiều.

Em nick mới nên chưa react được. Uk đúng rồi bác. Đoạn clear() mảng em không nghĩ ra. Bảo sao nếu dùng add thì nó có tất cả những max đã duyệt qua. Cảm ơn bác nhé

Gửi từ Xiaomi 220333QAG bằng vozFApp
 

Flow-chart

Junior Member
Chào tháng 7 các thím. Chúc 1 tháng đầy đặn :p
Mở hàng tháng mới với 1 bài siêu dễ nào

https://leetcode.com/problems/search-insert-position

Java:
Given a sorted array of distinct integers and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.

You must write an algorithm with O(log n) runtime complexity.
bai nay minh lam ntn k b co dc goi la log(n) k ?

var searchInsert = function(nums, target) {
let index = 0;
while(true){
if(nums[0] >= target) return 0 + index
if(target > nums[nums.length -1]) return nums.length+ index
if(target == nums[nums.length -1]) return nums.length - 1 + index
if(target >= nums[Math.round(nums.length / 2)]){
index += Math.round(nums.length /2)
nums = nums.slice(Math.round(nums.length / 2),nums.length)
}else{
nums = nums.slice(0,Math.round(nums.length /2))
}
}
};
 
Top