Skip to content

Commit 5ab8f83

Browse files
authored
Create 3548-equal-sum-grid-partition-ii.js
1 parent 51a9c8e commit 5ab8f83

File tree

1 file changed

+107
-0
lines changed

1 file changed

+107
-0
lines changed

3548-equal-sum-grid-partition-ii.js

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
/**
2+
* @param {number[][]} grid
3+
* @return {boolean}
4+
*/
5+
var canPartitionGrid = function (grid) {
6+
const n = grid.length
7+
const m = grid[0].length
8+
9+
let totalRowSum = 0n,
10+
totalColSum = 0n
11+
const prefixRowWise = new Array(n).fill(0n)
12+
const prefixColWise = new Array(m).fill(0n)
13+
14+
const MAXV = 100000
15+
const minRow = new Array(MAXV + 1).fill(null)
16+
const maxRow = new Array(MAXV + 1).fill(null)
17+
const minCol = new Array(MAXV + 1).fill(null)
18+
const maxCol = new Array(MAXV + 1).fill(null)
19+
20+
for (let i = 0; i < n; i++) {
21+
for (let j = 0; j < m; j++) {
22+
const v = grid[i][j]
23+
const val = BigInt(v)
24+
prefixRowWise[i] += val
25+
prefixColWise[j] += val
26+
27+
if (minRow[v] === null) {
28+
minRow[v] = maxRow[v] = i
29+
minCol[v] = maxCol[v] = j
30+
} else {
31+
if (i < minRow[v]) minRow[v] = i
32+
if (i > maxRow[v]) maxRow[v] = i
33+
if (j < minCol[v]) minCol[v] = j
34+
if (j > maxCol[v]) maxCol[v] = j
35+
}
36+
}
37+
}
38+
39+
for (const r of prefixRowWise) totalRowSum += r
40+
totalColSum = totalRowSum
41+
42+
let currentRowUpperSum = 0n
43+
for (let i = 0; i < n - 1; i++) {
44+
currentRowUpperSum += prefixRowWise[i]
45+
const lowerSegmentSum = totalRowSum - currentRowUpperSum
46+
if (currentRowUpperSum === lowerSegmentSum) return true
47+
48+
if (currentRowUpperSum > lowerSegmentSum) {
49+
const diff = currentRowUpperSum - lowerSegmentSum
50+
if (diff <= MAXV && minRow[Number(diff)] !== null) {
51+
if (i === 0 || m === 1) {
52+
if (diff === BigInt(grid[0][0]) || diff === BigInt(grid[0][m - 1]))
53+
return true
54+
} else if (minRow[Number(diff)] <= i) {
55+
return true
56+
}
57+
}
58+
} else {
59+
const diff = lowerSegmentSum - currentRowUpperSum
60+
if (diff <= MAXV && maxRow[Number(diff)] !== null) {
61+
if (i === n - 2 || m === 1) {
62+
if (
63+
diff === BigInt(grid[i + 1][0]) ||
64+
diff === BigInt(grid[i + 1][m - 1])
65+
)
66+
return true
67+
} else if (maxRow[Number(diff)] > i) {
68+
return true
69+
}
70+
}
71+
}
72+
}
73+
74+
let currentColLeftSum = 0n
75+
for (let j = 0; j < m - 1; j++) {
76+
currentColLeftSum += prefixColWise[j]
77+
const rightSegmentSum = totalColSum - currentColLeftSum
78+
if (currentColLeftSum === rightSegmentSum) return true
79+
80+
if (currentColLeftSum > rightSegmentSum) {
81+
const diff = currentColLeftSum - rightSegmentSum
82+
if (diff <= MAXV && minCol[Number(diff)] !== null) {
83+
if (j === 0 || n === 1) {
84+
if (diff === BigInt(grid[0][0]) || diff === BigInt(grid[n - 1][0]))
85+
return true
86+
} else if (minCol[Number(diff)] <= j) {
87+
return true
88+
}
89+
}
90+
} else {
91+
const diff = rightSegmentSum - currentColLeftSum
92+
if (diff <= MAXV && maxCol[Number(diff)] !== null) {
93+
if (j === m - 2 || n === 1) {
94+
if (
95+
diff === BigInt(grid[0][j + 1]) ||
96+
diff === BigInt(grid[n - 1][j + 1])
97+
)
98+
return true
99+
} else if (maxCol[Number(diff)] > j) {
100+
return true
101+
}
102+
}
103+
}
104+
}
105+
106+
return false
107+
}

0 commit comments

Comments
 (0)