-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path1337_javascript.js
107 lines (90 loc) · 2.43 KB
/
1337_javascript.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// 给你一个大小为 m * n 的方阵 mat,方阵由若干军人和平民组成,分别用 1 和 0 表示。
// 请你返回方阵中战斗力最弱的 k 行的索引,按从最弱到最强排序。
// 如果第 i 行的军人数量少于第 j 行,或者两行军人数量相同但 i 小于 j,那么我们认为第 i 行的战斗力比第 j 行弱。
// 军人 总是 排在一行中的靠前位置,也就是说 1 总是出现在 0 之前。
// 示例 1:
// 输入: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
// 输出:[2,0,3]
// 解释:
// 每行中的军人数目:
// 行 0 -> 2
// 行 1 -> 4
// 行 2 -> 1
// 行 3 -> 2
// 行 4 -> 5
// 从最弱到最强对这些行排序后得到 [2,0,3,1,4]
// 示例 2:
// 输入:mat =
// [[1,0,0,0],
// [1,1,1,1],
// [1,0,0,0],
// [1,0,0,0]],
// k = 2
// 输出:[0,2]
// 解释:
// 每行中的军人数目:
// 行 0 -> 1
// 行 1 -> 4
// 行 2 -> 1
// 行 3 -> 1
// 从最弱到最强对这些行排序后得到 [0,2,3,1]
// 提示:
// m == mat.length
// n == mat[i].length
// 2 <= n, m <= 100
// 1 <= k <= m
// matrix[i][j] 不是 0 就是 1
// 二分法
/**
* @param {number[][]} mat
* @param {number} k
* @return {number[]}
*/
var kWeakestRows = function(mat, k) {
let i=0,arr = [];
while(i < mat.length){
let left = 0,right = mat[0].length;
while(left <= right){
// 第一位为平民
if(mat[i][0] == 0){
arr.push([i,0]);
break;
}
// 最后一位为军人
if(mat[i][mat[0].length-1] == 1){
arr.push([i,mat[0].length]);
break;
}
let mid = left + Math.floor((right-left)/2);
// mid =1 并且 后面一位为0
if(mat[i][mid] == 1 && mat[i][mid+1] == 0) {
arr.push([i,mid+1]);
break;
}
if(mat[i][mid] == 0){
right = mid - 1;
}else {
left = mid + 1;
}
}
i++
}
// 优化
return arr.sort(function(a,b){
return a[1] - b[1]
}).splice(0,k).map(item => item[0])
// arr.sort(function(a,b){
// return a[1] - b[1]
// })
// let returnArr = [];
// arr.forEach(item=>{
// returnArr.push(item[0])
// })
// return returnArr.splice(0,k)
};