Bạn có thể làm điều đó trong O(n)
( n
số chữ số) như thế này:
Bắt đầu từ bên phải, bạn tìm thấy cặp chữ số đầu tiên sao cho chữ số bên trái nhỏ hơn chữ số bên phải. Hãy tham khảo chữ số bên trái của "chữ số-x". Tìm số nhỏ nhất lớn hơn chữ số-x ở bên phải chữ số-x và đặt ngay bên trái chữ số-x. Cuối cùng, sắp xếp các chữ số còn lại theo thứ tự tăng dần - vì chúng đã theo thứ tự giảm dần , tất cả những gì bạn cần làm là đảo ngược chúng (lưu cho chữ số-x, có thể được đặt ở vị trí chính xác trong O(n)
) .
Một ví dụ sẽ làm cho điều này rõ ràng hơn:
123456784987654321
bắt đầu bằng một con số
123456784 987654321
^ vị trí đầu tiên từ bên phải nơi chữ số bên trái nhỏ hơn bên phải
Chữ số "x" là 4
123456784 987654321
^ tìm chữ số nhỏ nhất lớn hơn 4 ở bên phải
123456785 4 98764321
^ đặt nó ở bên trái của 4
123456785 4 12346789
123456785123446789
^ sắp xếp các chữ số ở bên phải của 5. Vì tất cả chúng ngoại trừ
'4' đã được sắp xếp theo thứ tự giảm dần, tất cả những gì chúng ta cần làm là
đảo ngược thứ tự của họ và tìm vị trí chính xác cho '4'
Bằng chứng về sự đúng đắn:
Chúng ta hãy sử dụng chữ in hoa để xác định chuỗi chữ số và chữ thường cho chữ số. Cú pháp AB
có nghĩa là "nối chuỗi A
và B
" . <
là thứ tự từ điển, giống như thứ tự số nguyên khi các chuỗi chữ số có độ dài bằng nhau.
Số N ban đầu của chúng tôi có dạng AxB
, trong đó x
là một chữ số duy nhất và B
được sắp xếp giảm dần.
Số được tìm thấy bởi thuật toán của chúng tôi AyC
, trong đó y ∈ B
là chữ số nhỏ nhất > x
(nó phải tồn tại do cách x
đã được chọn, xem ở trên) và C
được sắp xếp tăng dần.
Giả sử có một số số (sử dụng cùng một chữ số) N'
sao cho AxB < N' < AyC
. N'
phải bắt đầu bằng A
nếu không nó không thể nằm giữa chúng, vì vậy chúng ta có thể viết nó dưới dạng AzD
. Bây giờ bất đẳng thức của chúng ta là AxB < AzD < AyC
, tương đương với xB < zD < yC
nơi cả ba chuỗi chữ số chứa cùng một chữ số.
Để điều đó trở thành sự thật, chúng ta phải có x <= z <= y
. Vì y
là chữ số nhỏ nhất > x
, z
không thể nằm giữa chúng, vì vậy z = x
hoặc z = y
. Nói z = x
. Khi đó bất đẳng thức của chúng ta là xB < xD < yC
, có nghĩa là B < D
cả hai B
và D
có cùng một chữ số. Tuy nhiên, B là giảm dần sắp xếp, do đó là không có chuỗi với những chữ số lớn hơn nó. Vì vậy, chúng ta không thể có B < D
. Thực hiện theo các bước tương tự, chúng tôi thấy rằng nếu z = y
, chúng tôi không thể có D < C
.
Do đó N'
không thể tồn tại, có nghĩa là thuật toán của chúng tôi tìm đúng số lớn nhất tiếp theo.