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

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)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 ạ :((

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ỏ leftright (ko phải int* đâu nhé, nó là chi tiết cài đặt :smiley: )

  • Khởi tạo cả hai vào đầu mảng
  • Tăng right đến khi \Delta > k hay right 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 ạ

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?