image.png
image.png

贪心

  • 一个数组统计每一行有多少个1
  • 另外一个数组统计每一列有多少个1

假设第0行有170个1, 第N - 1行有150个1,
那么150个1往上移动肯定比170个1往下移动省, 所以总代价先+150(往上移动一个格子)
image.png
此时看N - 2行,因为N -1 行的150个1全部移动到了N - 2行,所以此时N - 2行就是250个1去跟170个1pk,所以170个1往下移动一行, 每次都是这样,最终会在某一行遇上
image.png
。。。
弄完之后你就定位到了移动到哪一行最省,接着依葫芦画瓢去定位哪一列,

然后最小步数就出来了

  1. public static int minTotalDistance(int[][] grid) {
  2. int N = grid.length;
  3. int M = grid[0].length;
  4. int[] iOnes = new int[N];
  5. int[] jOnes = new int[M];
  6. for (int i = 0; i < N; i++) {
  7. for (int j = 0; j < M; j++) {
  8. if (grid[i][j] == 1) {
  9. iOnes[i]++;
  10. jOnes[j]++;
  11. }
  12. }
  13. }
  14. int total = 0;
  15. int i = 0;
  16. int j = N - 1;
  17. int iRest = 0;
  18. int jRest = 0;
  19. while (i < j) {
  20. if (iOnes[i] + iRest <= iOnes[j] + jRest) {
  21. total += iOnes[i] + iRest;
  22. iRest += iOnes[i++];
  23. } else {
  24. total += iOnes[j] + jRest;
  25. jRest += iOnes[j--];
  26. }
  27. }
  28. i = 0;
  29. j = M - 1;
  30. iRest = 0;
  31. jRest = 0;
  32. while (i < j) {
  33. if (jOnes[i] + iRest <= jOnes[j] + jRest) {
  34. total += jOnes[i] + iRest;
  35. iRest += jOnes[i++];
  36. } else {
  37. total += jOnes[j] + jRest;
  38. jRest += jOnes[j--];
  39. }
  40. }
  41. return total;
  42. }