题目链接:
不想戳的看下图:
示例:
提示:
解题思路1:
HashMap+CompareTo方法
分析:
我们需要按照每行1的数量对数列的索引进行从小到大排序,可以使用HashMap存储<索引,相应1的数量>,最后取出前k个key。
过程:
遍历每行数组,相应的信息存入map。
将map对应的Entry存入ArrayList列表。
排序时调用Collections.sort()方法,并重写compareTo()方法,list按照value从大到小进行排序,如果value相等则按照key排序。
最后遍历ArrayList将前k个对象的key赋值给数组。
代码如下:
class Solution {
HashMap<Integer,Integer> map=new HashMap<>();
public int[] kWeakestRows(int[][] mat, int k) {
for(int i=0;i<mat.length;i++){
int ans=0;
for(int j=0;j<mat[0].length;j++){
if(mat[i][j]==0){
break;
}
ans++;
}
map.put(i,ans);
}
List<Map.Entry<Integer,Integer>> lstEntry=new ArrayList<>(map.entrySet());
Collections.sort(lstEntry,((o1,o2)->{
if(o1.getValue()==o2.getValue()){
return o1.getKey()-o2.getKey();
}
return o1.getValue().compareTo(o2.getValue());
}));
int[] arr=new int[k];
for(int i=0;i<k;i++){
arr[i]=lstEntry.get(i).getKey();
}
return arr;
}
}
解题思路2:
二分加优先队列。
(这种方法较简单,留给同学们拓展。)
其实是我不会
小结
这题方法较多,不止朴素算法种。多动脑筋,说不定有更简便的方法。