Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

นับจำนวนตัวเลขลบใน Matrix ที่เรียงแล้ว แบบ Row-wise และ Column-wise

โจทย์: นับจำนวนจำนวนเต็มลบใน Matrix ที่เรียงลำดับจากน้อยไปมากทั้งแถวและคอลัมน์ (Row-wise และ Column-wise sorted)

เงื่อนไข Matrix ที่เรียงแล้ว

ค่าทุกตำแหน่ง จะน้อยกว่าหรือเท่ากับค่าทางขวา (คอลัมน์ถัดไป) และค่าด้านล่าง (แถวถัดไป)

M = [[-40, -12, 1, 5],
     [-20, -2,  5, 15],
     [-22, -1, 13, 18],
     [-12, 0,  15, 38]]

อัลกอริทึมที่เหมาะสม (O(m+n))

เริ่มจากมุมซ้ายล่าง (หรือขวาบน) แล้วเคลื่อนที่ตามเงื่อนไข:

  • ถ้าค่าปัจจุบัน >= 0: ขึ้นบน 1 แถว (ค่าจะน้อยลง)
  • ถ้าค่าปัจจุบัน < 0: นับแล้วขยับขวา 1 คอลัมน์
matrix = [
    [-40, -12, 1, 5],
    [-20, -2,  5, 15],
    [-22, -1, 13, 18],
    [-12, 0,  15, 38]
]

row_count = len(matrix)
col_count = len(matrix[0])

row = row_count - 1  # เริ่มแถวสุดท้าย
col = 0              # เริ่มคอลัมน์แรก
count = 0

while row >= 0 and col < col_count:
    if matrix[row][col] >= 0:
        row -= 1      # ขึ้นบน
    else:
        count += (row + 1)  # ทุกแถวเหนือคอลัมน์นี้ต้องเป็นลบด้วย
        col += 1            # ขยับขวา

print("Count of Negative Integers:", count)  # 7

ผลลัพธ์

Count of Negative Integers: 7

เหตุผลที่ทำงานได้

เพราะ Matrix เรียงแล้ว: หาก M[row][col] < 0 แล้ว ทุกแถวเหนือ (0 ถึง row) ในคอลัมน์เดียวกันก็ต้องเป็นลบเช่นกัน จึงนับได้ทีละ (row+1) ทันที

ประยุกต์ใช้

อัลกอริทึมเดียวกันใช้ได้กับการนับค่าที่ น้อยกว่าค่าใดก็ได้ (ไม่ใช่แค่ 0) โดยเปลี่ยนเงื่อนไข >= 0 เป็น > threshold