Description
You are given an m x n
binary matrix mat
of 1
’s (representing soldiers) and 0
’s (representing civilians). The soldiers are positioned in front of the civilians. That is, all the 1
’s will appear to the left of all the 0
’s in each row.
A row i
is weaker than a row j
if one of the following is true:
- The number of soldiers in row
i
is less than the number of soldiers in rowj
. - Both rows have the same number of soldiers and
i < j
.
Return the indices of the k
weakest rows in the matrix ordered from weakest to strongest.
Example 1:
Input: mat = [[1,1,0,0,0], [1,1,1,1,0], [1,0,0,0,0], [1,1,0,0,0], [1,1,1,1,1]], k = 3 Output: [2,0,3] Explanation: The number of soldiers in each row is:
- Row 0: 2
- Row 1: 4
- Row 2: 1
- Row 3: 2
- Row 4: 5 The rows ordered from weakest to strongest are [2,0,3,1,4].
Example 2:
Input: mat = [[1,0,0,0], [1,1,1,1], [1,0,0,0], [1,0,0,0]], k = 2 Output: [0,2] Explanation: The number of soldiers in each row is:
- Row 0: 1
- Row 1: 4
- Row 2: 1
- Row 3: 1 The rows ordered from weakest to strongest are [0,2,3,1].
Constraints:
m == mat.length
n == mat[i].length
2 <= n, m <= 100
1 <= k <= m
matrix[i][j]
is either 0 or 1.
Code
Max Heap
Time Complexity: , Space Complexity:
cmp
因為是 max heap 所以沒用到,不過還是寫出來,代表我會寫。
class Solution {
struct cmp {
bool operator() (const pair<int, int>& p1, const pair<int, int>& p2) {
if(p1.first < p2.first)
return true;
else if (p1.first == p2.first && p1.second < p2.second)
return true;
else
return false;
}
};
public:
vector<int> kWeakestRows(vector<vector<int>>& mat, int k) {
priority_queue<pair<int, int>, vector<pair<int, int>>> max_heap;
for(int i = 0; i < mat.size(); i++) {
int s = getNumberOfSoilder(mat[i]);
max_heap.push({s, i});
if(max_heap.size() > k) {
max_heap.pop();
}
}
vector<int> res;
while(max_heap.size()) {
res.push_back(max_heap.top().second);
max_heap.pop();
}
reverse(res.begin(), res.end());
return res;
}
int getNumberOfSoilder(vector<int>& row) {
int l = 0, r = row.size() - 1;
while(l < r) {
int m = l + (r - l + 1) / 2;
if(row[m] == 0) {
r = m - 1;
} else {
l = m;
}
}
return row[l] == 0 ? 0 : l + 1;
}
};
Sorting
Time Complexity: , Space Complexity:
class Solution {
public:
vector<int> kWeakestRows(vector<vector<int>>& mat, int k) {
int n = mat[0].size();
for(int i = 0; i < mat.size(); i++) {
mat[i].push_back(i);
}
sort(mat.begin(), mat.end());
vector<int> res(k);
for(int i = 0; i < k; i++) {
res[i] = mat[i][n];
}
return res;
}
};