Array
Math
Matrix
Sorting
Description
Given an m x n
binary grid grid
where each 1
marks the home of one friend, return the minimal total travel distance .
The total travel distance is the sum of the distances between the houses of the friends and the meeting point.
The distance is calculated using Manhattan Distance , where distance(p1, p2) = |p2.x - p1.x| + |p2.y - p1.y|
.
Example 1:
Input: grid = [[1,0,0,0,1],[0,0,0,0,0],[0,0,1,0,0]]
Output: 6
Explanation: Given three friends living at (0,0), (0,4), and (2,2).
The point (0,2) is an ideal meeting point, as the total travel distance of 2 + 2 + 2 = 6 is minimal.
So return 6.
Example 2:
Input: grid = [[1,1]]
Output: 1
Constraints:
m == grid.length
n == grid[i].length
1 <= m, n <= 200
grid[i][j]
is either 0
or 1
.
There will be at least two friends in the grid
.
Solutions
Solution 1
Python3 Java C++ Go Rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 class Solution :
def minTotalDistance ( self , grid : List [ List [ int ]]) -> int :
def f ( arr , x ):
return sum ( abs ( v - x ) for v in arr )
rows , cols = [], []
for i , row in enumerate ( grid ):
for j , v in enumerate ( row ):
if v :
rows . append ( i )
cols . append ( j )
cols . sort ()
i = rows [ len ( rows ) >> 1 ]
j = cols [ len ( cols ) >> 1 ]
return f ( rows , i ) + f ( cols , j )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 class Solution {
public int minTotalDistance ( int [][] grid ) {
int m = grid . length , n = grid [ 0 ] . length ;
List < Integer > rows = new ArrayList <> ();
List < Integer > cols = new ArrayList <> ();
for ( int i = 0 ; i < m ; ++ i ) {
for ( int j = 0 ; j < n ; ++ j ) {
if ( grid [ i ][ j ] == 1 ) {
rows . add ( i );
cols . add ( j );
}
}
}
Collections . sort ( cols );
int i = rows . get ( rows . size () >> 1 );
int j = cols . get ( cols . size () >> 1 );
return f ( rows , i ) + f ( cols , j );
}
private int f ( List < Integer > arr , int x ) {
int s = 0 ;
for ( int v : arr ) {
s += Math . abs ( v - x );
}
return s ;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 class Solution {
public :
int minTotalDistance ( vector < vector < int >>& grid ) {
int m = grid . size (), n = grid [ 0 ]. size ();
vector < int > rows ;
vector < int > cols ;
for ( int i = 0 ; i < m ; ++ i ) {
for ( int j = 0 ; j < n ; ++ j ) {
if ( grid [ i ][ j ]) {
rows . emplace_back ( i );
cols . emplace_back ( j );
}
}
}
sort ( cols . begin (), cols . end ());
int i = rows [ rows . size () / 2 ];
int j = cols [ cols . size () / 2 ];
auto f = []( vector < int >& arr , int x ) {
int s = 0 ;
for ( int v : arr ) {
s += abs ( v - x );
}
return s ;
};
return f ( rows