Cho một mảng arr
và một số nguyên dương k
. Tìm số lượng phần tử nhỏ nhất trong mảng cần xóa đi đi sao cho max(arr) - min(arr) <= k . Trong đó max(arr) và min(arr) lần lượt là phần tử lớn nhất và nhỏ nhất của mảng sau khi đã xóa đi các phần tử đó.
Ví dụ * Với arr = [1, 5, 6, 2, 8], k = 2
. Đầu ra minRemovals(arr, k) = 3.
Ông nào trùm thuật toán chỉ em hướng đi với ạ :((
Tìm số lượng phần tử nhỏ nhất trong mảng cần xóa đi sao cho max(arr) - min(arr) <= k
Thay vì tìm số phần tử bị xoá tối thiểu, sao không chuyển thành bài toán giữ lại số phần tử tối đa. Khi đó bạn chỉ cần tìm số phần tử a[i] đến a[i] + k. Đây là bài toán tìm kiếm nhị phân với a đã sắp xếp
5 Likes
Chuẩn men, binary search, với mỗi phần tử a[x] đã sắp xếp tăng dần, tìm y lớn nhất sao cho a[y] - a[x] <= k
3 Likes
Cảm ơn các bác nhưng em vẫn không rõ y lắm…
em có làm qua binary search rồi nhưng mà vẫn mù mịt ý tưởng ạ :((
mấy bác làm một ví dụ ngắn như ví dụ [1,5,7,8] k =3 được không ạ
Bạn dùng hai con trỏ left
và right
(ko phải int*
đâu nhé, nó là chi tiết cài đặt )
- Khởi tạo cả hai vào đầu mảng
- Tăng
right
đến khi \Delta > k hayright
vượt ra ngoài mảng (dùng binary search từ right đến end). Ghi nhận độ dài dãy ở đây. - Tăng
left
đến khi \Delta \leq k (dùng binary search từ left đến right)
3 Likes
dạ em cảm ơn bác nhiều ạ