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 hayrightvượ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 ạ
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?