mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-09 02:53:31 +08:00
Merge pull request #2383 from Relsola/master
Update 0084.柱状图中最大的矩形 变量名错误修复和可读性优化,0200.岛屿数量 新增TS深度搜索优先解法
This commit is contained in:
@ -515,27 +515,31 @@ func largestRectangleArea(heights []int) int {
|
|||||||
var largestRectangleArea = function(heights) {
|
var largestRectangleArea = function(heights) {
|
||||||
const len = heights.length;
|
const len = heights.length;
|
||||||
const minLeftIndex = new Array(len);
|
const minLeftIndex = new Array(len);
|
||||||
const maxRigthIndex = new Array(len);
|
const maxRightIndex = new Array(len);
|
||||||
// 记录每个柱子 左边第一个小于该柱子的下标
|
// 记录每个柱子 左边第一个小于该柱子的下标
|
||||||
minLeftIndex[0] = -1; // 注意这里初始化,防止下面while死循环
|
minLeftIndex[0] = -1; // 注意这里初始化,防止下面while死循环
|
||||||
for(let i = 1; i < len; i++) {
|
for(let i = 1; i < len; i++) {
|
||||||
let t = i - 1;
|
let t = i - 1;
|
||||||
// 这里不是用if,而是不断向左寻找的过程
|
// 这里不是用if,而是不断向左寻找的过程
|
||||||
while(t >= 0 && heights[t] >= heights[i]) t = minLeftIndex[t];
|
while (t >= 0 && heights[t] >= heights[i]) {
|
||||||
|
t = minLeftIndex[t];
|
||||||
|
}
|
||||||
minLeftIndex[i] = t;
|
minLeftIndex[i] = t;
|
||||||
}
|
}
|
||||||
// 记录每个柱子 右边第一个小于该柱子的下标
|
// 记录每个柱子 右边第一个小于该柱子的下标
|
||||||
maxRigthIndex[len - 1] = len; // 注意这里初始化,防止下面while死循环
|
maxRightIndex[len - 1] = len; // 注意这里初始化,防止下面while死循环
|
||||||
for(let i = len - 2; i >= 0; i--){
|
for(let i = len - 2; i >= 0; i--){
|
||||||
let t = i + 1;
|
let t = i + 1;
|
||||||
// 这里不是用if,而是不断向右寻找的过程
|
// 这里不是用if,而是不断向右寻找的过程
|
||||||
while(t < len && heights[t] >= heights[i]) t = maxRigthIndex[t];
|
while (t <= n && heights[t] > heights[i]) {
|
||||||
maxRigthIndex[i] = t;
|
t = maxRightIndex[t];
|
||||||
|
}
|
||||||
|
maxRightIndex[i] = t;
|
||||||
}
|
}
|
||||||
// 求和
|
// 求和
|
||||||
let maxArea = 0;
|
let maxArea = 0;
|
||||||
for(let i = 0; i < len; i++){
|
for(let i = 0; i < len; i++){
|
||||||
let sum = heights[i] * (maxRigthIndex[i] - minLeftIndex[i] - 1);
|
let sum = heights[i] * (maxRightIndex[i] - minLeftIndex[i] - 1);
|
||||||
maxArea = Math.max(maxArea , sum);
|
maxArea = Math.max(maxArea , sum);
|
||||||
}
|
}
|
||||||
return maxArea;
|
return maxArea;
|
||||||
@ -544,23 +548,33 @@ var largestRectangleArea = function(heights) {
|
|||||||
//单调栈
|
//单调栈
|
||||||
var largestRectangleArea = function(heights) {
|
var largestRectangleArea = function(heights) {
|
||||||
let maxArea = 0;
|
let maxArea = 0;
|
||||||
const stack = [];
|
const stack = [0];
|
||||||
heights = [0,...heights,0]; // 数组头部加入元素0 数组尾部加入元素0
|
heights.push(0);
|
||||||
for(let i = 0; i < heights.length; i++){
|
const n = heights.length;
|
||||||
if(heights[i] > heights[stack[stack.length-1]]){ // 情况三
|
|
||||||
|
for (let i = 1; i < n; i++) {
|
||||||
|
let top = stack.at(-1);
|
||||||
|
// 情况三
|
||||||
|
if (heights[top] < heights[i]) {
|
||||||
stack.push(i);
|
stack.push(i);
|
||||||
} else if(heights[i] === heights[stack[stack.length-1]]){ // 情况二
|
}
|
||||||
|
// 情况二
|
||||||
|
if (heights[top] === heights[i]) {
|
||||||
stack.pop(); // 这个可以加,可以不加,效果一样,思路不同
|
stack.pop(); // 这个可以加,可以不加,效果一样,思路不同
|
||||||
stack.push(i);
|
stack.push(i);
|
||||||
} else { // 情况一
|
}
|
||||||
while(heights[i] < heights[stack[stack.length-1]]){// 当前bar比栈顶bar矮
|
// 情况一
|
||||||
const stackTopIndex = stack.pop();// 栈顶元素出栈,并保存栈顶bar的索引
|
if (heights[top] > heights[i]) {
|
||||||
let w = i - stack[stack.length -1] - 1;
|
while (stack.length > 0 && heights[top] > heights[i]) {
|
||||||
let h = heights[stackTopIndex]
|
// 栈顶元素出栈,并保存栈顶bar的索引
|
||||||
|
const h = heights[stack.pop()];
|
||||||
|
const left = stack.at(-1) ?? -1;
|
||||||
|
const w = i - left - 1;
|
||||||
// 计算面积,并取最大面积
|
// 计算面积,并取最大面积
|
||||||
maxArea = Math.max(maxArea, w * h);
|
maxArea = Math.max(maxArea, w * h);
|
||||||
|
top = stack.at(-1);
|
||||||
}
|
}
|
||||||
stack.push(i);// 当前bar比栈顶bar高了,入栈
|
stack.push(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return maxArea;
|
return maxArea;
|
||||||
|
@ -276,6 +276,52 @@ var numIslands = function (grid) {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### TypeScript
|
||||||
|
|
||||||
|
```TypeScript
|
||||||
|
function numIslands2(grid: string[][]): number {
|
||||||
|
// 四个方向
|
||||||
|
const dir: number[][] = [[0, 1], [1, 0], [-1, 0], [0, -1]];
|
||||||
|
const [m, n]: [number, number] = [grid.length, grid[0].length];
|
||||||
|
|
||||||
|
function dfs(grid: string[][], visited: boolean[][], x: number, y: number) {
|
||||||
|
const queue: number[][] = [[x, y]];
|
||||||
|
while (queue.length !== 0) {
|
||||||
|
//取出队列头部元素
|
||||||
|
const top: number[] = queue.shift()!;
|
||||||
|
for (let i = 0; i < 4; i++) {
|
||||||
|
const nextX: number = top[0] + dir[i][0];
|
||||||
|
const nextY: number = top[1] + dir[i][1];
|
||||||
|
// 越界了,直接跳过
|
||||||
|
if (nextX < 0 || nextX >= m || nextY < 0 || nextY >= n) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!visited[nextX][nextY] && grid[nextX][nextY] === '1') {
|
||||||
|
queue.push([nextX, nextY]);
|
||||||
|
// 只要加入队列立刻标记
|
||||||
|
visited[nextX][nextY] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const visited: boolean[][] = Array.from({ length: m }, _ => new Array(n).fill(false));
|
||||||
|
|
||||||
|
let result = 0;
|
||||||
|
for (let i = 0; i < m; i++) {
|
||||||
|
for (let k = 0; k < n; k++) {
|
||||||
|
if (!visited[i][k] && grid[i][k] === '1') {
|
||||||
|
++result; // 遇到没访问过的陆地,+1
|
||||||
|
visited[i][k] = true;
|
||||||
|
dfs(grid, visited, i, k); // 将与其链接的陆地都标记上 true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
### Rust
|
### Rust
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
|
@ -346,6 +346,46 @@ var numIslands = function (grid) {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### TypeScript
|
||||||
|
|
||||||
|
```TypeScript
|
||||||
|
function numIslands(grid: string[][]): number {
|
||||||
|
// 四个方向
|
||||||
|
const dir: number[][] = [[0, 1], [1, 0], [-1, 0], [0, -1]];
|
||||||
|
const [m, n]: [number, number] = [grid.length, grid[0].length];
|
||||||
|
|
||||||
|
function dfs(grid: string[][], visited: boolean[][], x: number, y: number) {
|
||||||
|
for (let i = 0; i < 4; i++) {
|
||||||
|
let nextX: number = x + dir[i][0];
|
||||||
|
let nextY: number = y + dir[i][1];
|
||||||
|
// 越界了,直接跳过
|
||||||
|
if (nextX < 0 || nextX >= m || nextY < 0 || nextY >= n) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// 没有访问过同时是陆地
|
||||||
|
if (!visited[nextX][nextY] && grid[nextX][nextY] === '1') {
|
||||||
|
visited[nextX][nextY] = true;
|
||||||
|
dfs(grid, visited, nextX, nextY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const visited: boolean[][] = Array.from({ length: m }, _ => new Array(n).fill(false));
|
||||||
|
|
||||||
|
let result: number = 0;
|
||||||
|
for (let i = 0; i < m; i++) {
|
||||||
|
for (let k = 0; k < n; k++) {
|
||||||
|
if (!visited[i][k] && grid[i][k] === '1') {
|
||||||
|
++result; // 遇到没访问过的陆地,+1
|
||||||
|
visited[i][k] = true;
|
||||||
|
dfs(grid, visited, i, k); // 将与其链接的陆地都标记上 true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### Go
|
### Go
|
||||||
|
|
||||||
```go
|
```go
|
||||||
|
Reference in New Issue
Block a user