Cho số n và một mảng có kích thước m, trong đó m < n. Với điều kiện là mỗi số trong mảng nằm trong khoảng từ 0 đến n-1 (bao gồm), tôi muốn nhận được càng nhiều càng tốt danh sách các số n-m từ 0 đến n-1 không nằm trong mảng.Tạo danh sách các số còn lại
Đó là cách tôi đang làm nó (trong giả), nhưng nó cảm thấy khá hiệu quả và tôi tự hỏi nếu có một cách tốt hơn:
int[] remaining (int[] assigned) {
Set<int> s
int[n-m] remaining
add each int in assigned to s
for(i = 0 to n-1)
if(not s.contains(i)) remaining.add(i);
}
Đây không phải là bất kỳ ngôn ngữ máy tính cụ thể nhưng nó nên bất lịch sự. Chúng tôi giả định rằng việc truy cập vào một mảng là tất nhiên O (1) và thêm/kiểm tra một bộ là O (log (n)) như là một tập AVL sẽ được. Vì vậy, về cơ bản tôi đang cố gắng để có được điều này trong thời gian tuyến tính, thay vì O (n · logn) như bây giờ, nhưng nếu mảng ban đầu không được sắp xếp tôi không biết làm thế nào để đi về nó, hoặc nếu nó thậm chí có thể .
Nếu bạn có khả năng nhớ, một mảng bit kích thước n có thể được sử dụng để giải quyết vấn đề trong thời gian tuyến tính. (Thuật toán là hiển nhiên.) – ooga
Tôi không hoàn toàn theo thuật toán hiển nhiên. Bạn có thể giải thích? CHỈNH SỬA: Ồ, chờ chút, bạn có nghĩa là boolean? – Setzer22
Ồ, xin lỗi! Tôi đã nghĩ rằng bạn sẽ init mảng bit cho tất cả 0, đi qua danh sách các số thiết lập bit tương ứng với 1, và sau đó đi qua mảng bit và in các vị trí của tất cả các bit vẫn bằng 0. – ooga