Chúng tôi có thể điều chỉnh câu trả lời của Từ Giống như câu trả lời của Jared, bằng cách xem nó có thể sai như thế nào.
Ý tưởng trong câu trả lời đó - một câu trả lời hay - là "cuộn xuống dốc". Điều này chỉ có nghĩa là, nếu bạn đang ở trên một yếu tố, kiểm tra xem nó là một tối thiểu địa phương. Nếu vậy, bạn đã hoàn thành; nếu không, hãy bước đến hàng xóm nhỏ nhất gần nhất. Cuối cùng điều này phải chấm dứt bởi vì mỗi bước là một phần tử nhỏ hơn, và điều đó không thể đi mãi mãi trong một mảng hữu hạn.
Vấn đề với phương pháp này là các "cán" có thể quanh co khắp nơi:
20 100 12 11 10 100 2
19 100 13 100 9 100 3
18 100 14 100 8 100 4
17 16 15 100 7 6 5
Nếu bạn bắt đầu ở phía trên bên trái và "cuộn xuống dốc", bạn sẽ ghé thăm khoảng một nửa trong số các yếu tố trong mảng. Đó là quá nhiều, vì vậy chúng ta phải hạn chế nó một chút.
Bắt đầu bằng cách kiểm tra cột giữa và hàng giữa. Tìm yếu tố nhỏ nhất trong số đó và bắt đầu ở đó.
Cuộn một bước "xuống dưới" từ đó để nhập một trong bốn phần tư. Bạn sẽ nhập một trong các góc tọa độ, bởi vì các phần tử liền kề ở cột giữa và/hoặc hàng lớn hơn, do đó chỉ một trong hai phần tư liền kề có thể là "xuống dốc".
Bây giờ, hãy xem xét điều gì sẽ xảy ra nếu bạn "cuộn xuống dưới" từ đó. Rõ ràng, bạn cuối cùng sẽ đạt đến mức tối thiểu địa phương. (Chúng tôi sẽ không thực sự làm điều này bởi vì nó sẽ mất quá lâu.) Nhưng, trong quá trình lăn xung quanh, bạn sẽ không bao giờ rời khỏi góc phần tư đó ... Bởi vì làm như vậy, bạn sẽ phải vượt qua cột giữa hoặc hàng giữa và không có yếu tố nào nhỏ hơn nơi bạn bắt đầu. Do đó góc phần tư chứa một địa phương tối thiểu ở đâu đó.
Vì vậy, trong thời gian tuyến tính, chúng tôi đã xác định được góc phần tư phải chứa mức tối thiểu địa phương và chúng tôi đã cắt giảm một nửa. Bây giờ chỉ cần recurse.
Thuật toán này cần thời gian 2n + 2n/2 + 2n/4 + ..., bằng 4n, là O (n) vì vậy chúng tôi đã hoàn tất.
Thật thú vị, chúng tôi không sử dụng "lăn xuống dốc" nhiều lắm, ngoại trừ phần quan trọng: Chứng minh rằng thuật toán hoạt động.
[Cập nhật]
Như Incassator points out, câu trả lời này là không hoàn toàn đúng, bởi vì sau khi bạn "chỉ recurse" bạn có thể cuộn ra khỏi góc phần tư một lần nữa ...
Việc sửa chữa đơn giản nhất là tìm ra phần tử nhỏ nhất giữa hàng giữa, cột giữa, và ranh giới trước khi bạn "cuộn xuống dưới".
Làm điều đó trong 'O (log (n)) 'hoặc' O (n) '? –
Có n^2 yếu tố, vì vậy, O (n) sẽ thật tuyệt vời. Tất nhiên, O (log (n)) sẽ là tuyệt vời nếu có thể –
Ngoài ra chúng ta cần phải cẩn thận về những gì 'n' là. Ban đầu bạn nói 'n' là số hàng và cột có nghĩa là có số' n^2'. Mỗi số có khoảng 4 hàng xóm nên có khoảng 2 cặp * 4^2/2', đúng không? Có nghĩa là về 'm' là số cặp nếu chúng ta phải làm điều đó trong' O (m) 'thì đó là' O (n^2) '. Ngoài ra, chúng tôi chỉ tính toán tối thiểu một địa phương - không phải yếu tố nhỏ nhất? –