Bạn là một người đam mê lập trình trẻ sống với 2 người bạn thân nhất của bạn. Mỗi tuần, một trong số các bạn phải làm tất cả các công việc trong nhà và bạn quyết định xem đó là lượt nào bằng cách chọn một cây gậy. Người nào chọn cây gậy ngắn nhất sẽ thua và làm tất cả các công việc.
Vì tất cả các bạn là lập trình viên và thích tạo ra các câu đố, bạn đã sửa đổi "Chọn cây gậy ngắn nhất" thành một câu đố trên máy tính.
Dưới đây là các quy tắc của câu đố.
- Bạn sẽ được cung cấp một ma trận 2D, trong đó mỗi cột đại diện cho một thanh.
- Trong mỗi cột, 1 đại diện cho một phần của thanh và 0 là khoảng trống
- Khi đi từ trên xuống dưới trong mỗi cột, ban đầu bạn có
0
's và ngay sau khi bạn nhấn một1
, cây gậy đã bắt đầu và nghỉ ngơi của cột sẽ được lấp đầy với1
chỉ - Bạn có thể viết chương trình của bạn để chọn một cột. Kích thước của thanh trong cột đó xác định người chiến thắng / người thua cuộc. Kích thước của thanh == số 1s trong cột đó.
- Tuy nhiên, chương trình đó chỉ có thể có độ phức tạp thời gian trường hợp xấu nhất tuyến tính.
Vì tất cả các bạn là lập trình viên, bạn sẽ biết liệu chương trình của người khác có đang giới hạn độ phức tạp thời gian hay không.
Công việc của bạn là:
- Viết chương trình hoặc hàm chấp nhận đầu vào ở định dạng 2D hoặc mảng chuỗi.
- Đầu vào có thể được lấy từ STDIN / prompt / console hoặc đối số chức năng.
- Nếu bạn đang đọc đầu vào từ STDIN / prompt thì bạn có thể giả sử rằng việc đọc đầu vào và chuyển đổi nó thành một mảng mất 0 thời gian (mặc dù mã để làm như vậy phải có trong câu trả lời của bạn)
- Xác định cột có thanh dài nhất trong đó.
- Đầu ra có thể là giá trị trả về của hàm hoặc tới STDOUT / console / alert.
- Chương trình / hàm phải có độ phức tạp thời gian trong trường hợp xấu nhất tuyến tính,
O(m+n)
trong đóm
là số lượng hàng vàn
số cột.
Đầu vào có thể là một trong các định dạng sau:
Mảng 2D:
[ [0, 0, 0, 0],
[1, 0, 0, 0],
[1, 1, 0, 1],
[1, 1, 1, 1] ]
Mảng của chuỗi:
[ "0000", "1000", "1101", "1111" ]
Đầu vào sẽ có các thuộc tính sau:
- Kích thước của mảng là không xác định, giả sử một hình chữ nhật có kích thước bất kỳ
- Trong bất kỳ cột nào, từ trên xuống, nếu bạn thấy 1, thì mọi thứ bên dưới sẽ là một
- Các cột trống (tức là 0 độ dài) được cho phép.
Đây là một môn đánh gôn để mã ngắn nhất sẽ thắng ! *
Vui lòng giải thích mã của bạn hoặc cung cấp phiên bản chưa được chỉnh sửa (để xác minh độ phức tạp thời gian) cùng với định dạng đầu vào nào trong hai định dạng bạn mong đợi.
CẬP NHẬT Độ phức tạp thời gian tuyến tính ở đây có nghĩa là O (n + m) trong đó n là kích thước cột và m là kích thước hàng. (Dành cho những người không rõ ràng)
CẬP NHẬT 2 Điều này chắc chắn có thể được thực hiện trong thời gian tuyến tính. Và nếu bạn đang đăng một câu trả lời, vui lòng trì hoãn việc đăng logic / thuật toán trong một vài ngày để chiến đấu công bằng :)
CẬP NHẬT 3 Tôi sẽ xem qua tất cả các câu trả lời trong vài giờ để xác thực độ phức tạp của thời gian và chương trình :)
1
trong đầu vào là ô cuối cùng nó là cần thiết để đọc toàn bộ đầu vào. Ngay cả khi thư viện tiêu chuẩn của một ngôn ngữ tạo ra quyền truy cập ngẫu nhiên vào stdin, trong các cảnh đó, nó sẽ đệm nó và do đó thời gian thực hiện là Omega (n * m).