คุณเป็นนักเขียนโปรแกรมอายุน้อยที่อาศัยอยู่กับเพื่อนสนิทอีก 2 คน คุณต้องทำทุกอย่างที่ต้องทำในบ้านทุกสัปดาห์และคุณตัดสินใจว่าใครเป็นคนเลือกโดยใช้ไม้เท้า คนที่เลือกไม้ที่สั้นที่สุดจะสูญเสียและทำหน้าที่เหลือเกิน
เนื่องจากคุณเป็นโปรแกรมเมอร์และรักการสร้างปริศนาคุณจึงได้ปรับเปลี่ยน "เลือกแท่งที่สั้นที่สุด" ให้เป็นตัวต่อคอมพิวเตอร์
นี่คือกฎของปริศนา
- คุณจะได้รับเมทริกซ์ 2D โดยที่แต่ละคอลัมน์แสดงถึงแท่ง
- ในแต่ละคอลัมน์ 1 หมายถึงส่วนหนึ่งของไม้และ 0 เป็นพื้นที่ว่าง
- เมื่อไปจากบนลงล่างในแต่ละคอลัมน์เริ่มแรกคุณมี
0
และทันทีที่คุณกดปุ่ม1
เริ่มและส่วนที่เหลือของคอลัมน์จะเต็มไปด้วย1
เพียง - คุณสามารถเขียนโปรแกรมของคุณเพื่อเลือกหนึ่งคอลัมน์ ขนาดของไม้เท้าในคอลัมน์นั้นจะเป็นตัวกำหนดผู้ชนะ / ผู้แพ้ ขนาดของแท่ง == จำนวน 1s ในคอลัมน์นั้น
- อย่างไรก็ตามโปรแกรมนั้นสามารถมีความซับซ้อนของเวลาเชิงเส้นตรงที่เลวร้ายที่สุดเท่านั้น
ในฐานะที่คุณทุกคนเป็นโปรแกรมเมอร์คุณจะรู้ว่าโปรแกรมของคนอื่นกำลังถ่ายภาพเวลาที่จำกัดความซับซ้อน
งานของคุณคือ:
- เขียนโปรแกรมหรือฟังก์ชั่นที่รับอินพุตในรูปแบบ 2D หรืออาร์เรย์ของสตริง
- อินพุตสามารถนำมาจาก STDIN / prompt / console หรืออาร์กิวเมนต์ของฟังก์ชัน
- หากคุณกำลังอ่านอินพุตจาก STDIN / พรอมต์คุณสามารถสันนิษฐานได้ว่าการอ่านอินพุตและการแปลงเป็นอาเรย์นั้นใช้เวลา 0 (แม้ว่ารหัสจะต้องมีในคำตอบของคุณ)
- กำหนดคอลัมน์ด้วยแท่งที่ยาวที่สุดในนั้น
- เอาต์พุตสามารถเป็นค่าส่งคืนของฟังก์ชันหรือไปยัง STDOUT / console / alert
- โปรแกรม / ฟังก์ชั่นจะต้องมีความซับซ้อนของเวลาที่เลวร้ายที่สุดเชิงเส้นตรง
O(m+n)
ซึ่งm
เป็นจำนวนแถวและn
จำนวนคอลัมน์
อินพุตอาจเป็นหนึ่งในรูปแบบต่อไปนี้:
อาร์เรย์ 2 มิติ:
[ [0, 0, 0, 0],
[1, 0, 0, 0],
[1, 1, 0, 1],
[1, 1, 1, 1] ]
Array of Strings:
[ "0000", "1000", "1101", "1111" ]
อินพุตจะมีคุณสมบัติดังต่อไปนี้:
- ขนาดของอาร์เรย์ไม่เป็นที่รู้จักให้ถือว่าเป็นสี่เหลี่ยมผืนผ้าทุกขนาด
- ในคอลัมน์ใด ๆ มาจากบนลงล่างถ้าคุณเห็น 1 ทุกอย่างด้านล่างจะเป็นหนึ่ง
- คอลัมน์เปล่า (เช่น 0 ความยาว) แท่งจะได้รับอนุญาต
นี่คือรหัสของกอล์ฟที่สั้นที่สุดที่จะชนะ ! *
โปรดอธิบายรหัสของคุณหรือให้รุ่นที่ไม่ดี (เพื่อตรวจสอบความซับซ้อนของเวลา) พร้อมกับรูปแบบอินพุตสองรูปแบบที่คุณคาดหวัง
อัพเดท ความซับซ้อนของเวลาเชิงเส้นตรงนี้หมายถึง O (n + m) โดยที่ n คือขนาดคอลัมน์และ m คือขนาดแถว (สำหรับผู้ที่ไม่ชัดเจน)
อัพเดท 2 สิ่งนี้สามารถทำได้ในเวลาเชิงเส้น และถ้าคุณโพสต์คำตอบอย่าลังเลที่จะโพสต์ตรรกะ / อัลกอริทึมภายในสองสามวันเพื่อต่อสู้อย่างยุติธรรม :)
UPDATE 3ฉันจะตอบคำถามทั้งหมดภายในสองสามชั่วโมงเพื่อตรวจสอบความซับซ้อนของเวลาและโปรแกรม :)
1
ในอินพุตนั้นเป็นเซลล์สุดท้าย จำเป็นต้องอ่านอินพุตทั้งหมด แม้ว่าไลบรารี่มาตรฐานของภาษาจะสุ่มเข้าถึง stdin ภายใต้ฉากมันจะบัฟเฟอร์และดังนั้นเวลาที่ใช้คือโอเมก้า (n * m)