혼자서 해결할 수 있을 때까지 LeetCode 솔루션 공부 8일차: 문제#221.최대 제곱(중/자바스크립트)
나는 어떤 문제(심지어 쉬운 문제라도)를 해결하는 방법에 대한 단서가 없기 때문에 시간을 낭비하고 알아낼 수 없다고 생각했습니다. 내 접근 방식은 다음과 같습니다.
망각 곡선 퇴치: 앞으로 3일 동안 질문을 다시 하십시오. 그리고 정기적으로 돌아와서 문제를 재검토하십시오.
문제 #221. 최대 제곱
Difficulty: Medium
Language: JavaScript
0과 1로 채워진 m x n 이진 행렬이 주어지면 1만 포함하는 가장 큰 정사각형을 찾아 면적을 반환합니다.
예 1:
Input: matrix = [["1","0","1","0","0"],["1","0","1","1","1"],
["1","1","1","1","1"],["1","0","0","1","0"]]
Output: 4
예 2:
Input: matrix = [["0","1"],["1","0"]]
Output: 1
예 3:
Input: matrix = [["0"]]
Output: 0
제약:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 300
matrix[i][j]
는 '0'
또는 '1'
입니다.해결책:
유투브 영상은 마지막에 링크된 솔루션을 설명하니 말로만 하는 것보다 이해가 더 잘 됩니다.) 이 문제를 해결하는 열쇠는 "1"을 포함하는 최대 길이를 찾아 "0"이 발견되어 루프를 끊을 때까지 새 행렬에 저장하는 것입니다. LeetCode 토론 게시판의 "carti"에서 아래 예를 인용합니다.
이것은 매우 간단하지만 "Cache"(주어진 행렬의 복사본)를 topleft, left, top + 1의 최소값으로 설정하여 무슨 일이 일어나는지 설명하겠습니다.
우리에게 다음이 주어졌다고 가정해 봅시다.
1 1 1
1 1 1
1 1 1
첫 번째 행은 algo에 따라 동일하게 유지되고 우리는 (1,0)에 있습니다. 이것은 첫 번째 열에 있기 때문에 동일하게 유지됩니다.
(1,1)에 도달하면 왼쪽 상단, 왼쪽 상단 및 상단 + 1의 최소값을 취하여 2이므로 Cache는 이제
1 1 1
1 2 1
1 1 1
그리고 우리는 새로운 최대값을 2로 설정했습니다.
더 많은 값을 업데이트하면 캐시는 다음과 같이 됩니다.
1 1 1
1 2 2
1 2 1
그런 다음 마지막 셀 (2,2)에 도달하면 다시 min을 취하면 다음과 같이 됩니다.
1 1 1
1 2 2
1 2 3
새로운 최대값은 3입니다.
결과는 3^2, 즉 9가 되며, 이는 이 예의 답입니다.
솔루션 코드:
function maximalSquare(matrix) {
if(!matrix || !matrix[0]) return 0
//To deal with edge cases where an empty matrix is given. If
// 'matrix' is false/doesn't exist (note 1) return 0.
let cache = [...matrix],
//create a copy (note 2) of given array 'matrix'
height = matrix.length,
width = matrix[0].length,
//define height and width of the array. Height of the array is
//the length of the array (note 3). And width of the array is the
//length of the first element of the array (note 3 & 4). For
//example, matrix array shown below has width and length of 2.
//Because the length of the matrix array is 2 (there are two
//arrays nested in the matrix array). The length of the first
//array ["0","1"] is also 2, which makes up the width of the
//matrix array.
// [["0","1"],
// ["1","0"]]
solution = Math.max(...matrix[0])
//solution = length of the largest square.
//set the initial value of the solution as the maximum (note 6)
//value of first array element. This is for the edge case where
//there is only one element in the matrix array. And because our
//iteration below starts from index 1 (the second element) of both
//row and column; if there is only one array in the matrix, the
//solution would be the max value of array. For example, if we
//have a matrix of [["0","1"]], the largest square that contains 1
//will be 1*1=1.
for (let i = 0; i < matrix.length; i++) {
solution = Math.max(solution, matrix[i][0])
}
//This is for the edge case where there are two elements in the
//matrix array and each element is a single element array. For
//example, [["0"],["1"]]. Because our iteration below starts from
//index 1 (the second element) of both row and column; if both
//elements are single element array, the solution would be the max
//value between two elements. For example, if we have a matrix of
//[["0"],["1"]], the max of array[0] is 0 and the max of array[1]
//is one, that will give us the max between two arrays of 1.
for (let row = 1; row < height; row++) {
for (let col = 1; col < width; col++) {
//start interating from second elment of second array (note 7)
if(matrix[row][col] === "1") {
cache[row][col] = Math.min(cache[row-1][col],
cache[row][col-1],cache[row-1][col-1])+1;
//if "1" if found, then compare it with it's surrounding element
//and save minimum (note 5) of these elements plus 1 and save it
//in the new maxtrix "Cashe" (see explaination above for reason
//behind this step.
solution = Math.max(cache[row][col], solution);
//update max solution
}
}
}
return solution **2
//the area of a square is the product of the length of each side
//with itself (note 8)
}
2022년 2월 19일 현재 솔루션 제출 세부정보
(아래 데이터는 매일 새로운 테스트/제출이 있으므로 다를 수 있음)
참조:
LeetCode Problem Link
LeetCode Discussion: carti
Note 1: Logical NOT(!)
Note 2: Spread syntax(...)
Note 3: Array.length
Note 4: Access an array item by its index
Note 5: Math.min()
Note 6: Math.max()
Note 7: for loop
Note 8: Exponentiation(**)
Blog Cover Image Credit
Reference
이 문제에 관하여(혼자서 해결할 수 있을 때까지 LeetCode 솔루션 공부 8일차: 문제#221.최대 제곱(중/자바스크립트)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/killingleetcode/day-8-of-studying-leetcode-solution-until-i-can-solve-one-on-my-own-problem221maximal-squaremediumjavascript-4bgf텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)