Updated files: .sync.cmd src/main/java/cn/whaifree/MonotoneStack/LeetCode739.java src/main/java/cn/whaifree/leetCode/LeetCode/LeetCode42.java
This commit is contained in:
parent
30cc40a5ab
commit
040afd5488
31
.sync.cmd
31
.sync.cmd
@ -1,5 +1,30 @@
|
||||
git add .
|
||||
git commit -m "Sync"
|
||||
git push origin master
|
||||
|
||||
@echo off
|
||||
|
||||
setlocal enabledelayedexpansion
|
||||
|
||||
git add .
|
||||
|
||||
:: 获取暂存区中的更改文件列表
|
||||
for /f "delims=" %%a in ('git diff --cached --name-only') do (
|
||||
set "changed_files=!changed_files! %%a"
|
||||
)
|
||||
|
||||
:: 如果没有文件更改,则设置一个默认的提交信息
|
||||
if "%changed_files%"=="" (
|
||||
set "commit_message=No files changed"
|
||||
) else (
|
||||
:: 设置提交信息,包括修改的文件列表
|
||||
set "commit_message=Updated files: %changed_files%"
|
||||
)
|
||||
|
||||
:: 执行git commit
|
||||
git commit -m "%commit_message%"
|
||||
echo "git push origin master"
|
||||
git push origin master
|
||||
echo "git push gitee master"
|
||||
git push gitee master
|
||||
echo "git push github master"
|
||||
git push github master
|
||||
|
||||
endlocal
|
||||
|
59
src/main/java/cn/whaifree/MonotoneStack/LeetCode739.java
Normal file
59
src/main/java/cn/whaifree/MonotoneStack/LeetCode739.java
Normal file
@ -0,0 +1,59 @@
|
||||
package cn.whaifree.MonotoneStack;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Deque;
|
||||
import java.util.LinkedList;
|
||||
|
||||
/**
|
||||
* @version 1.0
|
||||
* @Author whai文海
|
||||
* @Date 2024/4/8 11:48
|
||||
* @注释
|
||||
*/
|
||||
public class LeetCode739 {
|
||||
|
||||
@Test
|
||||
public void test()
|
||||
{
|
||||
int[] temperatures = {73,74,75,71,69,72,76,73};
|
||||
Solution solution = new Solution();
|
||||
int[] res = solution.dailyTemperatures(temperatures);
|
||||
System.out.println(Arrays.toString(res));
|
||||
|
||||
}
|
||||
|
||||
class Solution {
|
||||
/**
|
||||
* 单调栈
|
||||
*
|
||||
* 不断把i放入栈
|
||||
* if nums[i] > stack.peek
|
||||
* pop = stack.pop
|
||||
* res[] = i - pop
|
||||
* else
|
||||
* stack.push(i)
|
||||
*
|
||||
* @param temperatures
|
||||
* @return
|
||||
*/
|
||||
public int[] dailyTemperatures(int[] temperatures) {
|
||||
int[] res = new int[temperatures.length];
|
||||
Deque<Integer> stack = new LinkedList<>();
|
||||
stack.push(0);
|
||||
for (int i = 1; i < temperatures.length ; i++) {
|
||||
if (temperatures[i] > temperatures[stack.peek()]) {
|
||||
// 如果当前比遍历元素比 栈顶的大,证明该元素就是栈顶元素右边第一个大于他的值
|
||||
// 并且需要判断一下,当前元素是不是 新栈顶 的下一个大于他的
|
||||
while (!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]) {
|
||||
res[stack.peek()] = i - stack.peek();
|
||||
stack.pop();
|
||||
}
|
||||
}
|
||||
stack.push(i);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
}
|
||||
}
|
106
src/main/java/cn/whaifree/leetCode/LeetCode/LeetCode42.java
Normal file
106
src/main/java/cn/whaifree/leetCode/LeetCode/LeetCode42.java
Normal file
@ -0,0 +1,106 @@
|
||||
package cn.whaifree.leetCode.LeetCode;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Deque;
|
||||
import java.util.LinkedList;
|
||||
|
||||
/**
|
||||
* @version 1.0
|
||||
* @Author whai文海
|
||||
* @Date 2024/4/8 11:23
|
||||
* @注释
|
||||
*/
|
||||
public class LeetCode42 {
|
||||
|
||||
@Test
|
||||
public void test()
|
||||
{
|
||||
|
||||
int[] height = new int[]{0,1,0,2,1,0,1,3,2,1,2,1};
|
||||
int trap = new Solution2().trap(height);
|
||||
System.out.println(trap);
|
||||
}
|
||||
|
||||
class Solution {
|
||||
/**
|
||||
* 从左到右 获得每个位置的左边最高
|
||||
* 从右到左 获得每个位置的右边最高
|
||||
*
|
||||
* 取交集
|
||||
*
|
||||
* @param height
|
||||
* @return
|
||||
*/
|
||||
public int trap(int[] height) {
|
||||
int[] leftHeight = new int[height.length];
|
||||
int leftH = 0;
|
||||
for (int i = 0; i < height.length; i++) {
|
||||
leftH = Math.max(leftH, height[i]);
|
||||
leftHeight[i] = leftH;
|
||||
}
|
||||
int[] rightHeight = new int[height.length];
|
||||
int rightH = 0;
|
||||
for (int i = height.length - 1; i >= 0; i--) {
|
||||
rightH = Math.max(rightH, height[i]);
|
||||
rightHeight[i] = rightH;
|
||||
}
|
||||
|
||||
int res = 0;
|
||||
for (int i = 0; i < height.length; i++) {
|
||||
res += Math.min(rightHeight[i], leftHeight[i]) - height[i];
|
||||
}
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
class Solution2{
|
||||
/**
|
||||
* 关键在于
|
||||
* - i值 < 栈顶值 入栈
|
||||
* 【3 2 1】 递减,下一个遇到5时,先计算left=2 mid=1 right=5 的容积,再while left=3 mid=1 right=5的容积
|
||||
* - i值 > 栈顶值 需要计算i为槽时的容积
|
||||
* - i值 == 栈顶值 更新
|
||||
* @param height
|
||||
* @return
|
||||
*/
|
||||
public int trap(int[] height) {
|
||||
// 单调栈 找到右边第一个高于他的墙
|
||||
// 保证栈内元素,从上到下为递增的,这样就能获取到槽的两边,并且确保不会有一边为空的
|
||||
Deque<Integer> stack = new LinkedList<>();
|
||||
stack.push(0);
|
||||
int res = 0;
|
||||
for (int i = 1; i < height.length; i++) {
|
||||
if (height[i] > height[stack.peek()]) {
|
||||
// 遇到凹陷
|
||||
//pop up all lower value
|
||||
int heightAtIdx = height[i]; // 右边墙的高度
|
||||
// 不断判断左边的墙,因为如果左边的墙存在,必然大于上一个左墙 如height 3 2 1 5
|
||||
while (!stack.isEmpty() && (heightAtIdx > height[stack.peek()])){
|
||||
int mid = stack.pop(); // 中间槽的下标
|
||||
|
||||
if (!stack.isEmpty()){
|
||||
int left = stack.peek(); // 左边墙的下标
|
||||
|
||||
int h = Math.min(height[left], height[i]) - height[mid];
|
||||
int w = i - left - 1;
|
||||
int hold = h * w;
|
||||
|
||||
if (hold > 0) res += hold;
|
||||
}
|
||||
}
|
||||
stack.push(i);
|
||||
|
||||
|
||||
} else if (height[i] == height[stack.peek()]) {
|
||||
stack.pop();
|
||||
stack.push(i);
|
||||
}else {
|
||||
stack.push(i);
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user