-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch2DMatrix.js
64 lines (54 loc) · 1.84 KB
/
search2DMatrix.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
/*
74. Search a 2D Matrix
You are given an m x n integer matrix with the following two properties:
Each row is sorted in non-decreasing order.
The first integer of each row is greater than the last integer of the previous row.
Given an integer target, return true if target is in matrix or false otherwise.
You must write a solution in O(log(m * n)) time complexity.
Example 1:
Input: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
Output: true
Example 2:
Input: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
Output: false
*/
/**
* @param {number[][]} matrix
* @param {number} target
* @return {boolean}
*/
var searchMatrix = function (matrix, target) {
let i = 0
while (i < matrix.length) {
let arr = matrix[i]
let left = 0, right = arr.length - 1, middle = Math.floor((left + right) / 2)
if (target >= arr[left] && target <= arr[right]) {
while (arr[middle] !== target && left <= right) {
if (target < arr[middle]) {
right = middle - 1
} else {
left = middle + 1
}
middle = Math.floor((left + right) / 2)
}
return arr[middle] === target
} else {
i++
}
}
return false
};
// Best solution
function searchMatrix(matrix, target) {
if (!matrix.length || !matrix[0].length) return false
let row = 0
let col = matrix[0].length - 1
while (col >= 0 && row <= matrix.length - 1) {
if (matrix[row][col] === target) return true
else if (matrix[row][col] > target) col--
else if (matrix[row][col] < target) row++
}
return false
}
console.log(searchMatrix([[1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 60]], 3))
console.log(searchMatrix([[1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 60]], 13))