224.基本计算器
代码逻辑:
存储:左表达式 符号(用数字存) 右表达式 结果 数字栈
1.先申请以上变量
2.对这个字符串进行遍历
两种情况:数字和符号
数字:先将字符值转化为数值,然后再来一个遍历,遇到符号停止,来获取完整数值
最后,进行运算
符号:
运算符号: + - 对应操作变量即可
括号:( ---- 将现存的res,符号位,压入栈中
) ---- 现存的结果为右表达式 将栈弹出 弹出的第一位是符号位,第二位为左表达式
class Solution {
public int calculate(String s) {
int left = 0,right = 0,res =0;
int sign = 1;
Stack<Integer> stack = new Stack<Integer>();
for(int i = 0 ; i < s.length() ; i++){
char ch = s.charAt(i);
if(Character.isDigit(ch)){
int val = ch - '0';
while(i + 1 < s.length() && Character.isDigit(s.charAt(i + 1))){
i++;
val = val * 10 + s.charAt(i) - '0';
}
res = res + sign * val;
} else if(ch == '+'){
sign = 1;
} else if(ch == '-'){
sign = -1;
} else if(ch == '('){
stack.push(res);
res = 0;
stack.push(sign);
sign = 1;
} else if(ch == ')'){
sign = stack.pop();
right = res;
left = stack.pop();
res = left + sign * right;
}
}
return res;
}
}
84.柱状图中最大的矩形
我们依旧用 四步分析法 来分析一下这道题目。
-
模拟:模拟题目的运行。
-
规律:尝试总结出题目的一般规律和特点。
-
匹配:找到符合这些特点的数据结构与算法。
-
边界:考虑特殊情况。
代码逻辑:
变量:结果值(面积值),存储栈(每一位的高度),构造新数组(两边各加个零)--- 迁移数组
遍历:遍历新数组的每一个值
判断:
条件:1.栈不空 2.新数组的这一位 比 新数组的栈顶那一位 小 ---- 高度比较
弹出栈顶元素
获取栈顶元素的高
栈顶元素弹出后,新的栈顶元素为其左侧边界
右侧边界为当前索引值
计算宽度 , 和 面积(与以前的面积取最大值)
遍历中:将当前索引入栈
返回结果值
class Solution {
public int largestRectangleArea(int[] heights) {
int res = 0;
Stack<Integer> stack = new Stack<Integer>();
int[] newHeight = new int[heights.length + 2];
newHeight[0] = 0;
newHeight[newHeight.length - 1] = 0;
for(int i = 1; i < heights.length + 1 ; i++){
newHeight[i] = heights[i - 1];
}
for(int i = 0 ; i < newHeight.length; i++){
while(!stack.isEmpty() && newHeight[i] < newHeight[stack.peek()]){
int cur = stack.pop();
int curHeight = newHeight[cur];
int leftIndex = stack.peek();
int rightIndex = i;
int curWidth = rightIndex - leftIndex - 1;
res = Math.max(res, curHeight * curWidth);
}
stack.push(i);
}
return res;
}
}