BT: Cho dãy gồm N ( N <= 30000 ) số tự nhiên không vượt quá 10^9, tìm số tự nhiên nhỏ nhất không xuất hiện trong dãy.
Cho mình xin cái thuật toán luôn nhé.
Tìm số tự nhiên nhỏ nhất không xuất hiện trong mảng
thuật toán là gì?
bạn tự cho 1 dãy số rồi tự giải ra đáp án xem? bạn giải như thế nào?
bạn có biết giải bài này chưa?
1000 300 450 3 90 2 1 5
vậy với dãy trên thì đáp án là gì? giải như thế nào?
mình không biết nên mới hỏi :<
Trong dãy số này:
1000 300 450 3 90 2 1 5
Số nào là số tự nhiên bé nhất không xuất hiện trong mảng này vậy? Vì sao cậu biết?
- Bạn sắp xếp dãy đi đã rồi nhìn vào dãy sau khi sắp xếp là xong
bạn không biết làm thì viết code làm gì?
đọc đề xong cứ code đại rồi sửa sửa là sẽ ra được đáp án sao?
Computer programming is the process of designing and building an executable computer program to accomplish a specific computing result or to perform a specific task
bạn không biết bạn cần làm gì thì làm sao mô tả cho máy tính chạy?
Chả hiểu kiểu gì …?
:-> numbers[1..N]: int[]
<- int
return 0 if numbers.empty? || min(numbers) != 0 // đk đề bài
numbers.sort()
//đk đề bài
last_seen := 0
for_each number in numbers:
return last_seen + 1 if number > last_seen + 1
last_seen = number
return last_seen + 1
Không biết do bạn sai đề hay do mình mới dậy nhỉ " tìm số tự nhiên nhỏ nhất không xuất hiện trong dãy" không xuất hiện thì sao tìm ???
mình chỉ nghĩ được giải thuật đơn giản thế này thôi:
Sắp xếp dãy theo thứ tự từ bé đến lớn.
Duyệt từ phần tử bé nhất của dãy đến khi tìm được số tự nhiên cần tìm.
Độ phức tạp của thuật toán là 2N.
Thanks
Mình lấy ví dụ này cho dễ hiểu nhé:
Trong mảng 0; 1; 2; 4; 6
Thì số tự nhiên nhỏ nhất không xuất hiện trong dãy là 3
Đã sắp xếp thì là O(NlogN)
rồi mà ta?
Bài này có thể tính ở O(N)
bằng cách dùng HashSet.
Chi tiết hơn đi bạn. Mình vẫn chưa hình dung ra
Đại khái thì là vầy:
h = set(numbers)
i = 0
while i in h: i+=1
return i
Ngắn gọn đơn giản dễ hiểu nhỉ.
1 Like