You are provided with a 2D matrix called grid
, which has dimensions m x n
. Each cell in this matrix contains an integer value. Your task is to determine if this grid adheres to two specific conditions:
Vertical Equality Condition: Every cell in the grid should be equal to the cell directly below it (if such a cell exists). Formally, for each cell grid[i][j]
, it must be that grid[i][j] == grid[i + 1][j]
, provided i + 1
is within the bounds of the matrix. This means that each cell's value should match the value of the cell immediately below it in the same column, wherever such a cell exists.
Horizontal Difference Condition: Each cell in the grid should be different from the cell directly to its right (if such a cell exists). In other words, for each cell grid[i][j]
, it must be that grid[i][j] != grid[i][j + 1]
, provided j + 1
is within the bounds of the matrix. This ensures that each cell's value is distinct from the value of the cell immediately to its right, wherever such a cell exists.
Your goal is to implement a function that checks if these conditions are satisfied for the entire grid. If every cell meets both conditions, the function should return true
. If any cell fails to meet either condition, the function should return false
.
Input: grid = [[1,0,2],[1,0,2]]
Output: true
Input: grid = [[1,1,1],[0,0,0]]
Output: false
Input: grid = [[1],[2],[3]]
Output: false
1 <= m, n <= 10
: The number of rows and columns in the grid will be between 1 and 10, inclusive.
0 <= grid[i][j] <= 9
: Each cell value is an integer between 0 and 9.
function checkGridBasic(grid) {
const m = grid.length;
const n = grid[0].length;
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
if (i < m - 1 && grid[i][j] !== grid[i + 1][j]) return false;
if (j < n - 1 && grid[i][j] === grid[i][j + 1]) return false;
}
}
return true;
}
const grid1 = [[1,0,2],[1,0,2]];
checkGridBasic(grid1); //output: true
const grid2 = [[1,1,1],[0,0,0]];
checkGridBasic(grid2); //output: false
const grid3 = [[1],[2],[3]];
checkGridBasic(grid3); //output: false
function checkGridHelper(grid) {
function isValid(i, j) {
if (i < grid.length - 1 && grid[i][j] !== grid[i + 1][j]) return false;
if (j < grid[0].length - 1 && grid[i][j] === grid[i][j + 1]) return false;
return true;
}
for (let i = 0; i < grid.length; i++) {
for (let j = 0; j < grid[0].length; j++) {
if (!isValid(i, j)) return false;
}
}
return true;
}
const grid1 = [[1,0,2],[1,0,2]];
checkGridHelper(grid1); //output: true
const grid2 = [[1,1,1],[0,0,0]];
checkGridHelper(grid2); //output: false
const grid3 = [[1],[2],[3]];
checkGridHelper(grid3); //output: false
function checkGridRowCol(grid) {
const m = grid.length;
const n = grid[0].length;
for (let i = 0; i < m - 1; i++) {
for (let j = 0; j < n; j++) {
if (grid[i][j] !== grid[i + 1][j]) return false;
}
}
for (let i = 0; i < m; i++) {
for (let j = 0; j < n - 1; j++) {
if (grid[i][j] === grid[i][j + 1]) return false;
}
}
return true;
}
const grid1 = [[1,0,2],[1,0,2]];
checkGridRowCol(grid1); //output: true
const grid2 = [[1,1,1],[0,0,0]];
checkGridRowCol(grid2); //output: false
const grid3 = [[1],[2],[3]];
checkGridRowCol(grid3); //output: false
function checkGridEvery(grid) {
const m = grid.length;
const n = grid[0].length;
return grid.every((row, i) =>
row.every((value, j) =>
(i === m - 1 || value === grid[i + 1][j]) &&
(j === n - 1 || value !== grid[i][j + 1])
)
);
}
const grid1 = [[1,0,2],[1,0,2]];
checkGridEvery(grid1); //output: true
const grid2 = [[1,1,1],[0,0,0]];
checkGridEvery(grid2); //output: false
const grid3 = [[1],[2],[3]];
checkGridEvery(grid3); //output: false
function checkGridSome(grid) {
const m = grid.length;
const n = grid[0].length;
return !grid.some((row, i) =>
row.some((value, j) =>
(i < m - 1 && value !== grid[i + 1][j]) ||
(j < n - 1 && value === grid[i][j + 1])
)
);
}
const grid1 = [[1,0,2],[1,0,2]];
checkGridSome(grid1); //output: true
const grid2 = [[1,1,1],[0,0,0]];
checkGridSome(grid2); //output: false
const grid3 = [[1],[2],[3]];
checkGridSome(grid3); //output: false
function checkGridNestedLoops(grid) {
const m = grid.length;
const n = grid[0].length;
let isValid = true;
for (let i = 0; i < m && isValid; i++) {
for (let j = 0; j < n && isValid; j++) {
if (i < m - 1 && grid[i][j] !== grid[i + 1][j]) isValid = false;
if (j < n - 1 && grid[i][j] === grid[i][j + 1]) isValid = false;
}
}
return isValid;
}
const grid1 = [[1,0,2],[1,0,2]];
checkGridNestedLoops(grid1); //output: true
const grid2 = [[1,1,1],[0,0,0]];
checkGridNestedLoops(grid2); //output: false
const grid3 = [[1],[2],[3]];
checkGridNestedLoops(grid3); //output: false
function checkGridWhile(grid) {
const m = grid.length;
const n = grid[0].length;
let i = 0;
while (i < m) {
let j = 0;
while (j < n) {
if (i < m - 1 && grid[i][j] !== grid[i + 1][j]) return false;
if (j < n - 1 && grid[i][j] === grid[i][j + 1]) return false;
j++;
}
i++;
}
return true;
}
const grid1 = [[1,0,2],[1,0,2]];
checkGridWhile(grid1); //output: true
const grid2 = [[1,1,1],[0,0,0]];
checkGridWhile(grid2); //output: false
const grid3 = [[1],[2],[3]];
checkGridWhile(grid3); //output: false
function checkGridMap(grid) {
const m = grid.length;
const n = grid[0].length;
const checkMap = new Map();
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
if (i < m - 1 && grid[i][j] !== grid[i + 1][j]) checkMap.set('row', false);
if (j < n - 1 && grid[i][j] === grid[i][j + 1]) checkMap.set('col', false);
}
}
return !checkMap.has('row') && !checkMap.has('col');
}
const grid1 = [[1,0,2],[1,0,2]];
checkGridMap(grid1); //output: true
const grid2 = [[1,1,1],[0,0,0]];
checkGridMap(grid2); //output: false
const grid3 = [[1],[2],[3]];
checkGridMap(grid3); //output: false
function checkGridFilter(grid) {
const rowViolations = grid.flatMap((row, i) =>
row.flatMap((value, j) => (i < grid.length - 1 && value !== grid[i + 1][j]) ? [false] : [])
);
const colViolations = grid.flatMap((row, i) =>
row.flatMap((value, j) => (j < row.length - 1 && value === row[j + 1]) ? [false] : [])
);
return rowViolations.length === 0 && colViolations.length === 0;
}
const grid1 = [[1,0,2],[1,0,2]];
checkGridFilter(grid1); //output: true
const grid2 = [[1,1,1],[0,0,0]];
checkGridFilter(grid2); //output: false
const grid3 = [[1],[2],[3]];
checkGridFilter(grid3); //output: false
function checkGridRecursive(grid) {
function check(i, j) {
if (i >= grid.length) return true;
if (j >= grid[0].length) return check(i + 1, 0);
if (i < grid.length - 1 && grid[i][j] !== grid[i + 1][j]) return false;
if (j < grid[0].length - 1 && grid[i][j] === grid[i][j + 1]) return false;
return check(i, j + 1);
}
return check(0, 0);
}
const grid1 = [[1,0,2],[1,0,2]];
checkGridRecursive(grid1); //output: true
const grid2 = [[1,1,1],[0,0,0]];
checkGridRecursive(grid2); //output: false
const grid3 = [[1],[2],[3]];
checkGridRecursive(grid3); //output: false
function checkGridReduce(grid) {
const m = grid.length;
const n = grid[0].length;
return grid.reduce((valid, row, i) => {
return valid && row.reduce((rowValid, value, j) => {
if (i < m - 1 && value !== grid[i + 1][j]) return false;
if (j < n - 1 && value === grid[i][j + 1]) return false;
return rowValid;
}, true);
}, true);
}
const grid1 = [[1,0,2],[1,0,2]];
checkGridReduce(grid1); //output: true
const grid2 = [[1,1,1],[0,0,0]];
checkGridReduce(grid2); //output: false
const grid3 = [[1],[2],[3]];
checkGridReduce(grid3); //output: false
function checkGridFlags(grid) {
const m = grid.length;
const n = grid[0].length;
let isValid = true;
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
if (i < m - 1 && grid[i][j] !== grid[i + 1][j]) {
isValid = false;
break;
}
if (j < n - 1 && grid[i][j] === grid[i][j + 1]) {
isValid = false;
break;
}
}
if (!isValid) break;
}
return isValid;
}
const grid1 = [[1,0,2],[1,0,2]];
checkGridFlags(grid1); //output: true
const grid2 = [[1,1,1],[0,0,0]];
checkGridFlags(grid2); //output: false
const grid3 = [[1],[2],[3]];
checkGridFlags(grid3); //output: false
function checkGridGenerators(grid) {
for (const [i, j] of traverseGrid(grid)) {
if (i < grid.length - 1 && grid[i][j] !== grid[i + 1][j]) return false;
if (j < grid[0].length - 1 && grid[i][j] === grid[i][j + 1]) return false;
}
return true;
}
function* traverseGrid(grid) {
const m = grid.length;
const n = grid[0].length;
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
yield [i, j];
}
}
}
const grid1 = [[1,0,2],[1,0,2]];
checkGridGenerators(grid1); //output: true
const grid2 = [[1,1,1],[0,0,0]];
checkGridGenerators(grid2); //output: false
const grid3 = [[1],[2],[3]];
checkGridGenerators(grid3); //output: false