負載均衡--hash slot演算法
阿新 • • 發佈:2020-12-05
技術標籤:LeetCode每日一題
貪心:為了確保得到的值最大,陣列第一列必須是1,首先就可以對二維陣列的第一列不是1的記錄進行反轉,然後再處理列,每列中的1的個數大於一半,就進行反轉。這樣就能確保得到的值最大。
程式碼:
這是第一次過題程式碼,對二維陣列進行了反轉,其實不用,只需要求值就可以了。
class Solution {
public int matrixScore(int[][] A) {
int row = A.length, column = A[0].length;
for (int i = 0; i < row; i++) {
if (A[i][0] == 0) {
for (int j = 0; j < column; j++) {
A[i][j] = 1 - A[i][j];
}
}
}
for (int i = 1; i < column; i++) {
int cnt = 0;
for (int[] ints : A) {
cnt += ints[ i];
}
int rowCnt = row >> 1;
if (cnt <= rowCnt) {
for (int j = 0; j < row; j++) {
A[j][i] = 1 - A[j][i];
}
}
}
// 計算最後的值
int matrixScore = 0;
for (int i = 0; i < row; i++) {
int num = 1, sum = 0;
for (int j = column - 1; j >= 0; j--) {
sum += num * A[i][j];
num <<= 1;
}
matrixScore += sum;
}
return matrixScore;
}
}
修改後的程式碼
class Solution {
public int matrixScore(int[][] A) {
int row = A.length, column = A[0].length;
int matrixScore = 0;
// 1 << (column - 1) 相當於2的column - 1次方
matrixScore += row * (1 << (column - 1));
for (int j = 1; j < column; j++) {
int rowCnt = 0;
// 計算這一列有多少個1
// 因為沒有對陣列進行修改,這裡要判斷第一個數是否是1,是1不變,反之
for (int i = 0; i < row; i++) {
if (A[i][0] == 1) rowCnt += A[i][j];
else rowCnt += 1 - A[i][j];
}
matrixScore += Math.max(rowCnt, row - rowCnt) * (1 << (column - j - 1));
}
return matrixScore;
}
}