题目
给你一个大小为 m * n 的矩阵 mat,矩阵由若干军人和平民组成,分别用 1 和 0 表示。
请你返回矩阵中战斗力最弱的 k 行的索引,按从最弱到最强排序。
如果第 i 行的军人数量少于第 j 行,或者两行军人数量相同但 i 小于 j,那么我们认为第 i 行的战斗力比第 j 行弱。
军人 总是 排在一行中的靠前位置,也就是说 1 总是出现在 0 之前。
题目
思路
其实无非就是看谁的战斗力强,同等情况下以索引小的排在前面。因为索引是唯一的,所以这个排序结果是确定的!
然后就是对于结构体排序的问题,这个简单。自己创建一个类,封装索引和战斗力,并在实现排序的地方,优先按照战斗力排序,然后按照索引排序。获得前k个元素的索引即是最终结果!
代码
import java.util.Arrays;
import java.util.Comparator;
class Element{
int index; // 索引
int power; // 战斗力
public Element(int power, int index)
{
this.power = power;
this.index = index;
}
@Override
public String toString() {
return "Element{" +
"index=" + index +
", power=" + power +
'}';
}
}
class mycmp implements Comparator<Element>
{
@Override
public int compare(Element o1, Element o2) {
if (o1.power!=o2.power)
return o1.power-o2.power;
else
return o1.index-o2.index;
}
}
class Solution {
public int[] kWeakestRows(int[][] mat, int k)
{
int row=mat.length;
int column= mat[0].length;
Element element[]=new Element[row];
int count=0;
for (int i=0;i<row;++i)
{
count=0;
for (int j=0;j<column;++j)
{
if (mat[i][j]==1)++count;
}
element[i]=new Element(count,i);
}
Arrays.sort(element,new mycmp());// 排序
int ans[]=new int[k];
for (int i=0;i<k;++i)
ans[i]=element[i].index;
return ans;
}
}
结果
简单题,锻炼思维,顺便复习一下如何对结构体进行排序!