题目:
算法思想和代码整理在下面了,今天用到了dp动态规划,之后会整理一下知识点。
代码整理
python3
class Solution:
def orderOfLargestPlusSign(self, n: int, mines: List[List[int]]) -> int:
dp = [[n] * n for _ in range(n)]
banned = set(map(tuple, mines))
for i in range(n):
# left
count = 0
for j in range(n):
count = 0 if (i, j) in banned else count + 1
dp[i][j] = min(dp[i][j], count)
# right
count = 0
for j in range(n - 1, -1, -1):
count = 0 if (i, j) in banned else count + 1
dp[i][j] = min(dp[i][j], count)
for j in range(n):
# up
count = 0
for i in range(n):
count = 0 if (i, j) in banned else count + 1
dp[i][j] = min(dp[i][j], count)
# down
count = 0
for i in range(n - 1, -1, -1):
count = 0 if (i, j) in banned else count + 1
dp[i][j] = min(dp[i][j], count)
return max(map(max, dp))
java
class Solution {
public int orderOfLargestPlusSign(int n, int[][] mines) {
int[][] dp = new int[n][n];
for (int i = 0; i < n; i++) {
Arrays.fill(dp[i], n);
}
Set<Integer> banned = new HashSet<Integer>();
for (int[] vec : mines) {
banned.add(vec[0] * n + vec[1]);
}
int ans = 0;
for (int i = 0; i < n; i++) {
int count = 0;
/* left */
for (int j = 0; j < n; j++) {
if (banned.contains(i * n + j)) {
count = 0;
} else {
count++;
}
dp[i][j] = Math.min(dp[i][j], count);
}
count = 0;
/* right */
for (int j = n - 1; j >= 0; j--) {
if (banned.contains(i * n + j)) {
count = 0;
} else {
count++;
}
dp[i][j] = Math.min(dp[i][j], count);
}
}
for (int i = 0; i < n; i++) {
int count = 0;
/* up */
for (int j = 0; j < n; j++) {
if (banned.contains(j * n + i)) {
count = 0;
} else {
count++;
}
dp[j][i] = Math.min(dp[j][i], count);
}
count = 0;
/* down */
for (int j = n - 1; j >= 0; j--) {
if (banned.contains(j * n + i)) {
count = 0;
} else {
count++;
}
dp[j][i] = Math.min(dp[j][i], count);
ans = Math.max(ans, dp[j][i]);
}
}
return ans;
}
}
JavaScript
/**
* @param {number} n
* @param {number[][]} mines
* @return {number}
*/
var orderOfLargestPlusSign = function(n, mines) {
const dp = new Array(n).fill(0).map(() => new Array(n).fill(n));
const banned = new Set();
for (const vec of mines) {
banned.add(vec[0] * n + vec[1]);
}
let ans = 0;
for (let i = 0; i < n; i++) {
let count = 0;
/* left */
for (let j = 0; j < n; j++) {
if (banned.has(i * n + j)) {
count = 0;
} else {
count++;
}
dp[i][j] = Math.min(dp[i][j], count);
}
count = 0;
/* right */
for (let j = n - 1; j >= 0; j--) {
if (banned.has(i * n + j)) {
count = 0;
} else {
count++;
}
dp[i][j] = Math.min(dp[i][j], count);
}
}
for (let i = 0; i < n; i++) {
let count = 0;
/* up */
for (let j = 0; j < n; j++) {
if (banned.has(j * n + i)) {
count = 0;
} else {
count++;
}
dp[j][i] = Math.min(dp[j][i], count);
}
count = 0;
/* down */
for (let j = n - 1; j >= 0; j--) {
if (banned.has(j * n + i)) {
count = 0;
} else {
count++;
}
dp[j][i] = Math.min(dp[j][i], count);
ans = Math.max(ans, dp[j][i]);
}
}
return ans;
};
写在最后:以上代码与题目均来自力扣,我只是力扣的搬运工。方便自己与大家复习和回顾~