สมมติว่ามีกลุ่มคนตั้งแต่สองคนขึ้นไปและพวกเขาต้องการพบปะและลดระยะทางการเดินทางทั้งหมด เรามีตาราง 2D ของค่า 0 หรือ 1 โดยที่แต่ละค่า 1 ทำเครื่องหมายบ้านของใครบางคนในกลุ่ม ระยะทางคำนวณโดยใช้สูตรของ Manhattan Distance ดังนั้น Distance(p1, p2) =|p2.x - p1.x| + |p2.y - p1.y|.
ดังนั้นหากอินพุตเป็นแบบ
1 | 0 | 0 | 0 | 1 |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 0 |
ผลลัพธ์จะเป็น 6 จากเมทริกซ์ เราเข้าใจได้ว่ามีคนสามคนอาศัยอยู่ที่ (0,0) (0,4) และ (2,2):จุด (0,2 ) เป็นจุดนัดพบในอุดมคติ เนื่องจากระยะทางการเดินทางรวม 2+2+2=6 เป็นอย่างต่ำ
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน get() ซึ่งจะใช้อาร์เรย์ v
-
จัดเรียงอาร์เรย์ v
-
ผม :=0
-
j :=ขนาดของวี
-
ยกเลิก :=0
-
ในขณะที่ฉัน
-
ret :=ret + v[j] - v[i]
-
(เพิ่ม i ขึ้น 1)
-
(ลด j โดย 1)
-
-
รีเทิร์น
-
จากวิธีหลัก ให้ทำดังต่อไปนี้ −
-
กำหนดแถวอาร์เรย์
-
กำหนดคอลัมน์อาร์เรย์
-
สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาดของกริด อัปเดต (เพิ่ม i ขึ้น 1) ให้ทำ -
-
สำหรับการเริ่มต้น j :=0 เมื่อ j
-
ถ้า grid[i, j] ไม่ใช่ศูนย์ ดังนั้น −
-
ใส่ i ที่ท้ายแถว
-
ใส่ j ต่อท้าย col
-
-
-
-
ส่งคืน get(row) + get(col)
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#includeใช้ namespace std;class Solution {public:int minTotalDistance(vector >&grid) { vector row; เวกเตอร์ col; สำหรับ (int i =0; i v){ sort(v.begin(), v.end()); int ผม =0; int j =v.size() - 1; int ret =0; ในขณะที่ (i > v ={{1,0,0,0,1},{0,0,0,0,0},{0,0,1,0,0}}; ศาล <<(ob.minTotalDistance(v));}
อินพุต
<ล่วงหน้า>{{1,0,0,0,1},{0,0,0,0,0},{0,0,1,0,0}}เอาท์พุต
6