1 /**
2 * @param {number[][]} matrix
3 * @param {number} target
4 * @return {boolean}
5 */
6 const searchMatrix = function (matrix, target) {
7 const yLen = matrix.length;
8 const xLen = matrix[0].length;
9 if (matrix[0][0] > target || matrix[yLen - 1][xLen - 1] < target) {
10 return false;
11 }
12 let sx = 0; let sy = 0; let ex = xLen - 1; let ey = yLen - 1;
13 let midx, midy;
14 while (ey > sy || (ey === sy && ex >= sx)) {
15 if ((ey + sy) % 2 === 0) {
16 midy = (ey + sy) / 2;
17 midx = ~~((ex + sx) / 2);
18 } else {
19 midy = (ey + sy) / 2 >> 0;
20 if (ex > xLen - sx - 1) {
21 midx = ~~((ex - (xLen - sx - 1)) / 2);
22 midy += 1;
23 } else {
24 midx = ~~((xLen + sx - 1 - ex) / 2);
25 }
26 }
27 if (matrix[midy][midx] === target) {
28 return true;
29 } else if (matrix[midy][midx] > target) {
30 if (midx === 0) {
31 ey = midy - 1;
32 ex = xLen - 1;
33 } else {
34 ey = midy;
35 ex = midx - 1;
36 }
37 } else if (midx === xLen - 1) {
38 sy = midy + 1;
39 sx = 0;
40 } else {
41 sy = midy;
42 sx = midx + 1;
43 }
44 }
45 return false;
46 };