劍指offer——二維陣列中的查詢
阿新 • • 發佈:2020-07-10
連結:https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof
在一個 n * m 的二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 示例: 現有矩陣 matrix 如下: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30] ] 給定 target = 5,返回 true。 給定 target = 20,返回 false。 限制: 0 <= n <= 1000 0 <= m <= 1000
題解1
解題思路
一行程式碼!!!
Array.prototype.flat()
用於將巢狀的陣列拉平,變成一維陣列,返回新陣列。
[1, 2, [3, 4]].flat()
// [1, 2, 3, 4]
Array.prototype.includes
方法返回一個布林值,表示某個陣列是否包含給定的值。
[1, 2, 3].includes(2) // true
[1, 2, 3].includes(4) // false
程式碼
var findNumberIn2DArray = function(matrix, target) { return matrix.flat().includes(target); };
題解2
解題思路
儘量減少比較次數,減少迴圈
獲取一行陣列的長度m
,題目說的是n*m
,那麼m
應該是一個固定值。
先遍歷每一行陣列,因為每行都是升序,所以就比較首位兩個元素即可,找出v[0] <= target && v[m - 1] >= target
這種情況的,就表明target
可能會在這一行。
然後使用二分查詢,找出是否有目標值。
程式碼
/** * @param {number[][]} matrix * @param {number} target * @return {boolean} */ var findNumberIn2DArray = function(matrix, target) { //排出[]和[[]]這種情況 if (matrix.length === 0 || matrix[0].length === 0) return 0; //題目說的是n*m,那麼m應該是一個固定值 let m = matrix[0].length; for (v of matrix) { //進行首尾比較 if (v[0] <= target && v[m - 1] >= target) { //進行二分查詢 let min = 0; let max = m; let mid; while (mid != min && mid != max) { mid = parseInt((max + min) / 2); if (target > v[mid]) { min = mid + 1; } else if (target < v[mid]) { max = mid - 1; } else if (target === v[mid]) { //找到,返回結果 return true; } } } } //沒找到,返回結果 return false; };