1337.矩阵中战斗力最弱的K行
链接:1337.矩阵中战斗力最弱的K行
难度:Easy
标签:数组、二分查找、矩阵、排序、堆(优先队列)
简介:给你一个大小为 m * n 的矩阵 mat,矩阵由若干军人和平民组成,分别用 1 和 0 表示。请你返回矩阵中战斗力最弱的 k 行的索引,按从最弱到最强排序。
题解 1 - typescript
- 编辑时间:2021-08-01
- 执行用时:108ms
- 内存消耗:42.1MB
- 编程语言:typescript
- 解法介绍:哈希储存+二分查找。
function kWeakestRows(mat: number[][], k: number): number[] {
  return mat
    .map((list, i) => [i, find(list)])
    .map(v => {
      console.log(v);
      return v;
    })
    .sort(([i1, v1], [i2, v2]) => (v1 === v2 ? i1 - i2 : v1 - v2))
    .map(([i]) => i)
    .slice(0, k);
  function find(list: number[]): number {
    let l = 0;
    let r = list.length - 1;
    while (l < r) {
      const mid = (l + r) >> 1;
      if (list[mid] === 0) r = mid;
      else l = mid + 1;
    }
    if (list[l] === 1) return list.length;
    return l;
  }
}
题解 2 - typescript
- 编辑时间:2021-08-01
- 执行用时:76ms
- 内存消耗:39.9MB
- 编程语言:typescript
- 解法介绍:哈希储存。
function kWeakestRows(mat: number[][], k: number): number[] {
  return mat
    .map((list, i) => {
      const ans: [number, number] = [i, 0];
      for (const n of list) {
        if (n === 1) ans[1]++;
        else break;
      }
      return ans;
    })
    .sort(([i1, v1], [i2, v2]) => (v1 === v2 ? i1 - i2 : v1 - v2))
    .map(([i]) => i)
    .slice(0, k);
}