

贪心
- 一个数组统计每一行有多少个1
- 另外一个数组统计每一列有多少个1
假设第0行有170个1, 第N - 1行有150个1,
那么150个1往上移动肯定比170个1往下移动省, 所以总代价先+150(往上移动一个格子) 
此时看N - 2行,因为N -1 行的150个1全部移动到了N - 2行,所以此时N - 2行就是250个1去跟170个1pk,所以170个1往下移动一行, 每次都是这样,最终会在某一行遇上
。。。
弄完之后你就定位到了移动到哪一行最省,接着依葫芦画瓢去定位哪一列,
然后最小步数就出来了
public static int minTotalDistance(int[][] grid) {int N = grid.length;int M = grid[0].length;int[] iOnes = new int[N];int[] jOnes = new int[M];for (int i = 0; i < N; i++) {for (int j = 0; j < M; j++) {if (grid[i][j] == 1) {iOnes[i]++;jOnes[j]++;}}}int total = 0;int i = 0;int j = N - 1;int iRest = 0;int jRest = 0;while (i < j) {if (iOnes[i] + iRest <= iOnes[j] + jRest) {total += iOnes[i] + iRest;iRest += iOnes[i++];} else {total += iOnes[j] + jRest;jRest += iOnes[j--];}}i = 0;j = M - 1;iRest = 0;jRest = 0;while (i < j) {if (jOnes[i] + iRest <= jOnes[j] + jRest) {total += jOnes[i] + iRest;iRest += jOnes[i++];} else {total += jOnes[j] + jRest;jRest += jOnes[j--];}}return total;}
