js算法-矩陣


矩陣置零

力扣73. 矩陣置零

題目

給定一個 m x n 的矩陣,如果一個元素為 0,則將其所在行和列的所有元素都設為 0。請使用原地算法。

示例 1:

輸入: 
[
  [1,1,1],
  [1,0,1],
  [1,1,1]
]
輸出: 
[
  [1,0,1],
  [0,0,0],
  [1,0,1]
]
示例 2:

輸入: 
[
  [0,1,2,0],
  [3,4,5,2],
  [1,3,1,5]
]
輸出: 
[
  [0,0,0,0],
  [0,4,5,0],
  [0,3,1,0]
]
進階:

一個直接的解決方案是使用  O(mn) 的額外空間,但這並不是一個好的解決方案。
一個簡單的改進方案是使用 O(m + n) 的額外空間,但這仍然不是最好的解決方案。
你能想出一個常數空間的解決方案嗎?

解答1

思路1 非原地算法,
第一次遍歷將值為0的橫坐標與縱坐標存入表中,
第二次遍歷將橫坐標與縱坐標對應的行與列置為0

/** * 思路1 非原地算法, * 第一次遍歷將值為0的橫坐標與縱坐標存入表中, * 第二次遍歷將橫坐標與縱坐標對應的行與列置為0 * @param matrix */ var setZeroes = function (matrix) { var s1 = new Set() var s2 = new Set() for (var i = 0; i < matrix.length; i++) { for (var j = 0; j < matrix[i].length; j++) { if (matrix[i][j] === 0) { s1.add(i); s2.add(j); } } } for (var i = 0; i < matrix.length; i++) { if (s1.has(i)) { matrix[i] = new Array(matrix[i].length).fill(0) continue } for (var j = 0; j < matrix[i].length; j++) { if (s2.has(j)) { matrix[i][j] = 0 } } } return matrix }; var result = setZeroes([ [0, 1, 2, 0], [3, 4, 5, 2], [1, 3, 1, 5] ]) console.log(result) 

思路2,原地算法

var setZeroes2 = function (matrix) { for (let i = 0; i < matrix.length; i++) { for (let j = 0; j < matrix[0].length; j++) { //當前是0的話 if (Object.is(matrix[i][j], 0)) { // 處理當前行,將當前行的值都賦值為-0 // 為什么賦值為0 請查閱 https://web03.cn/notes#/notes/detail/96 // 0與-0在Object.is不相等,且在結果中相等,避免后來判斷前面已經賦值的0 for (let k = 0; k < matrix.length; k++) { if (!Object.is(matrix[k][j], 0) && k !== i) { matrix[k][j] = -0 } } // 處理當前列,將其置0 for (let k = 0; k < matrix[0].length; k++) { if (!Object.is(matrix[i][k], 0) && k !== j) { matrix[i][k] = -0 } } } } } return matrix }; var result2 = setZeroes2([ [0, 1, 2, 0], [3, 4, 5, 2], [1, 3, 1, 5] ]) console.log(result2) 

螺旋矩陣Ⅰ

54. 螺旋矩陣

題目
給定一個包含 m x n 個元素的矩陣(m 行, n 列),請按照順時針螺旋順序,返回矩陣中的所有元素。

代碼

示例 1:
輸入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
輸出:[1,2,3,6,9,8,7,4,5]

示例 2:
輸入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
輸出:[1,2,3,4,8,12,11,10,9,5,6,7]
var spiralOrder = function (matrix) { if (matrix.length === 0) return [] var res = [] var top = 0, bottom = matrix.length - 1, left = 0, right = matrix[0].length - 1 while (top <= bottom && left <= right) { for (var i = left; i <= right; i++) res.push(matrix[top][i]) top++ for (var i = top; i <= bottom; i++) res.push(matrix[i][right]) right-- if (top > bottom || left > right) break for (var i = right; i >= left; i--) res.push(matrix[bottom][i]) bottom-- for (var i = bottom; i >= top; i--) res.push(matrix[i][left]) left++ } return res }; var result = spiralOrder([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) console.log(result) 

思路: 分為上下左右四個邊界,從左到右,從上到下,左(left=0)右(right=行長-1)上(top=0)下(buttom=列長-1),通過對四條邊的循環,加上判斷條件進行每一圈的搜索

執行過程

while滿足條件,第一遍,走遍最外圈

while滿足條件,第二遍,走遍最外-1圈

螺旋矩陣 II

螺旋矩陣 II

題目 給你一個正整數 n ,生成一個包含 1 到 n2 所有元素,且元素按順時針順序螺旋排列的 n x n 正方形矩陣 matrix 。

示例 1:
輸入:n = 3
輸出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:
輸入:n = 1
輸出:[[1]]

提示:
1 <= n <= 20
var generaten = function(n) { // 初始化矩陣 var result = Array.from({ length: n }, () => Array(n)) var num = 1, rowStart = 0, // 行首邊界 rowEnd = n - 1, // 行尾邊界 columnStart = 0, // 列首邊界 columnEnd = n - 1 // 列尾邊界 while (num <= n * n) { // 首行 for (var i = columnStart; i <= columnEnd; i++) { result[rowStart][i] = num++ } rowStart++ // 尾列 for (var i = rowStart; i <= rowEnd; i++) { result[i][columnEnd] = num++ } columnEnd-- // 尾行 for (var i = columnEnd; i >= columnStart; i--) { result[rowEnd][i] = num++ } rowEnd-- // 首列 for (var i = rowEnd; i >= rowStart; i--) { result[i][columnStart] = num++ } columnStart++ } return result }; console.log(generaten(1)) console.log(generaten(3)) 

思路:與【螺旋矩陣Ⅰ】類似,其實就是它的生成過程,先初始化一個n*n的二維數組,然后通過上下左右邊界依次判斷,進行賦值

運行過程

https://web03.cn/blog/235


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM