题目描述
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.
解题思路
【C++】
1.priority_queue
class Solution {
public:
vector<int> kWeakestRows(vector<vector<int>>& mat, int k) {
typedef pair<int, int> P;
priority_queue<P, vector<P>, greater<P>>pq;
vector<int> vec;
for(int i=0;i<mat.size();i++){
int count=0;
for(int j=0;j<mat[i].size();j++){
if(mat[i][j]==1){count++;}
}
pq.push({count,i});
}
for(int i = 0; i<k; i++){
vec.push_back(pq.top().second);
pq.pop();
}
return vec;
}
};
2. vector
class Solution {
public:
vector<int> kWeakestRows(vector<vector<int>>& mat, int k) {
vector<int> res;
vector<pair<int,int>> pq;
for(int i=0;i<mat.size();i++){
int count=0;
for(int j=0;j<mat[i].size();j++){
if(mat[i][j]==1){count++;}
}
pq.push_back({i, count});
}
auto cmp = [](const pair<int,int> &a,const pair<int,int> &b) {
return a.second != b.second ? a.second < b.second : a.first < b.first;
};
sort(pq.begin(), pq.end(), cmp);
for (int i=0;i<k;i++) {res.push_back(pq[i].first);}
return res;
}
};
【Java】
1. HashMap + heap + PriorityQueue
class Solution {
public int[] kWeakestRows(int[][] mat, int k) {
Map<Integer, Integer> map = new HashMap<>();
for (int i =0;i<mat.length;i++) {
int sum = 0;
for(int j =0; j<mat[i].length; j++) {sum += mat[i][j];}
map.put(i, sum);
}
Queue<Integer> heap = new PriorityQueue<>((n1, n2)-> map.get(n2) == map.get(n1) ? n2 - n1 : map.get(n2) - map.get(n1));
for(int n: map.keySet()) {
heap.add(n);
if(heap.size() > k) heap.poll();
}
int[] res = new int[k];
for(int i=k-1; i>=0; i--) {res[i] = heap.poll();}
return res;
}
}
2. HashMap + List +Collection
class Solution {
public int[] kWeakestRows(int[][] mat, int k) {
Map<Integer, Integer> m = new HashMap<>();
for (int i=0; i<mat.length; i++){
int count=0, j=0;
while (j < mat[i].length) {count += mat[i][j++];}
m.put(i,count);
}
List<Integer> l = new ArrayList<>();
for(Map.Entry<Integer,Integer> i : m.entrySet()) {l.add(i.getKey());}
Collections.sort(l, (k1,k2) -> {return m.get(k1)==m.get(k2) ? k1-k2 : m.get(k1)-m.get(k2);});
int[] res = new int[k]; int index=0;
for (int i=0; i<k; i++) {res[i] = l.get(i);}
return res;
}
}
参考文献