publicstaticintminOps(int[] arr){ if (arr == null || arr.length == 0) { return0; } int size = arr.length; int sum = 0; for (int num : arr) { sum += num; }
if (sum % size != 0) { return -1; } int avg = sum / size; int leftSum = 0; // 左侧部分 int ans = 0; for (int i = 0; i < size; i++) { // 负需要输入 正需要输出 int leftRest = leftSum - i * avg; // 左侧部分 - 平均值 // 负需要输入 正需要输出 // 右侧部分 - 平均值 int rightRest = (sum - leftSum - arr[i]) - (size - i - 1) * avg; int need = 0; // i位置需要的移动次数 if (leftRest < 0 && rightRest < 0) { need = Math.abs(leftRest) + Math.abs(rightRest); } else { need = Math.max(Math.abs(leftRest), Math.abs(rightRest)); } ans = Math.max(ans, need); leftSum += arr[i]; } return ans; }
public List<Integer> spiralOrder(int[][] matrix){ List<Integer> list = new ArrayList<>(); int tR = 0; int tC = 0; int dR = matrix.length -1; int dC = matrix[0].length -1; while (tR <= dR && tC <= dC){ printEdge(matrix, tR++, tC++, dR--, dC--, list); } return list; }
publicstaticvoidprintEdge(int[][] m, int a, int b, int c, int d, List<Integer> list){ if (a == c) { //一条横线 for (int i = b; i <= d; i++) { list.add(m[a][i]); } } elseif (b == d) { // 一条竖线 for (int i = a; i <= c; i++) { list.add(m[i][b]); } } else { int curC = b; int curR = a; while (curC != d) { list.add(m[a][curC]); curC++; } while (curR != c) { list.add(m[curR][d]); curR++; } while (curC != b) { list.add(m[c][curC]); curC--; } while (curR != a) { list.add(m[curR][b]); curR--; } } }
publicvoidrotate(int[][] matrix){ int aRow = 0; int aCol = 0; int bRow = matrix.length - 1; int bCol = matrix[0].length - 1; while (aRow <= bRow){ rotateEdge(matrix, aRow, aCol, bRow, bCol); aRow++; aCol++; bRow--; bCol--; } }
privatevoidrotateEdge(int[][] m, int aRow, int aCol, int bRow, int bCol){ for (int i = 0; i< bCol - aCol; i++){ int tmp = m[aRow][aCol+i]; m[aRow][aCol+i] = m[bRow-i][aCol]; m[bRow-i][aCol] = m[bRow][bCol-i]; m[bRow][bCol-i] = m[aRow+i][bCol]; m[aRow+i][bCol] = tmp; } }
privatestaticbooleanisPrim(int n){ if (n <= 3) { return n > 1; } if (n % 6 != 1 && n % 6 != 5) { returnfalse; } int k = (int) Math.sqrt(n); for (int i = 5; i <= k; i++) { if (n % i == 0 || n % (i + 2) == 0) { returnfalse; } } returntrue;
}
privatestaticint[] divSumAndCount(int n) { int sum = 0; int count = 0; for (int i = 2; i <= n; i++) { while (n % i == 0) { sum += i; count++; n /= i; } } returnnewint[]{sum, count}; }
privatevoidheapify(int i, int index){ int l = index * 2 + 1; int r = index * 2 + 2; int smallest = index; while (l < heapSize) { if (heap[i].times < heap[index].times) { smallest = l; } // 操作右节点 if (r < heapSize && heap[r].times < heap[smallest].times) { smallest = r; } // 最小值不是index,调整堆 if (smallest != index) { swap(smallest, index); } else { break; } index = smallest; l = index * 2 + 1; r = index * 2 + 2; } }