leetcode 堆栈
来源:互联网 发布:蕨类植物 分形 算法 编辑:程序博客网 时间:2024/06/08 00:12
1、Evaluate Reverse Polish Notation
链接:http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/
思路:使用栈,数字进栈,符号出栈,注意数字可能有负数,注意判断条件
public int evalRPN(String[] tokens) { Stack stack = new Stack(); int len = tokens.length; int a, b, s; for(int i = 0; i < len; i++){ switch(tokens[i]){ case "+": b = (int)stack.pop(); a = (int)stack.pop(); s = a + b; stack.push(s); break; case "-": b = (int)stack.pop(); a = (int)stack.pop(); s = a - b; stack.push(s); break; case "*": b = (int)stack.pop(); a = (int)stack.pop(); s = a * b; stack.push(s); break; case "/": b = (int)stack.pop(); a = (int)stack.pop(); s = a / b; stack.push(s); break; default:stack.push(Integer.parseInt(tokens[i]));break; } } return (int)stack.pop(); }
2、Longest Valid Parentheses
链接:http://oj.leetcode.com/problems/longest-valid-parentheses/
思路:利用栈,为了便于求最长串,需要继续字符的下标。‘(’入栈,’)’如果栈顶是‘(’,出栈,否则,入栈。
public class Kuohao{ int i; char ch; public Kuohao(int i,char ch){ this.i = i; this.ch = ch; } } public int longestValidParentheses(String s) { if(s.length()<=1) return 0; Stack<Kuohao> stack = new Stack(); int len = s.length(); int temp, result = 0; for(int i = 0; i < len; i++) { if (s.charAt(i) == '(') { stack.push(new Kuohao(i, '(')); } else { if (!stack.isEmpty() && stack.peek().ch == '(') { stack.pop(); if (stack.isEmpty()) { temp = i + 1; } else { temp = i - stack.peek().i; } result = result > temp ? result : temp; }else { stack.push(new Kuohao(i,')')); } } } return result; }
3、Valid Parentheses
链接:http://oj.leetcode.com/problems/valid-parentheses/
思路:注意添加栈不为空的条件
public boolean isValid(String s) { if (s.length() == 0) return true; if(s.length() <= 1) return false; Stack stack = new Stack(); for(int i = 0; i < s.length(); i++){ switch (s.charAt(i)){ case '(': case '[': case '{': stack.push(s.charAt(i)); break; case ')': if(!stack.isEmpty() && stack.peek().equals('(')){ stack.pop(); break; }else return false; case ']': if(!stack.isEmpty() && stack.peek().equals('[')){ stack.pop(); break; }else return false; case '}': if(!stack.isEmpty() && stack.peek().equals('{')){ stack.pop(); break; }else return false; } } if(stack.isEmpty()) return true; return false; }
4、Largest Rectangle in Histogram
链接:http://oj.leetcode.com/problems/largest-rectangle-in-histogram/
思路:递归思想,将局部最大值保存下来;也可以利用栈来求解
public int largestRectangleArea(int[] heights) { int len = heights.length; int result = 0; for(int i = 0; i < len; i++){ if(i + 1 < len && heights[i] <= heights[i + 1]){ continue; } int area, min = heights[i]; for(int j = i; j >= 0; j--){ min = heights[j] < min ? heights[j] : min; area = min * (i - j + 1); result = area > result ? area : result; } } return result; }
5、Trapping Rain Water
链接:http://oj.leetcode.com/problems/trapping-rain-water/
思路:http://www.cnblogs.com/grandyang/p/4322653.html
需要left和right两个指针分别指向数组的首尾位置,从两边向中间扫描,在当前两指针确定的范围内,先比较两头找出较小值,如果较小值是left指向的值,则从左向右扫描,如果较小值是right指向的值,则从右向左扫描,若遇到的值比当较小值小,则将差值存入结果,如遇到的值大,则重新确定新的窗口范围,以此类推直至left和right指针重合。
public int trap(int[] height) { int result = 0; int left = 0, right = height.length - 1; int min = 0; while(left < right){ min = height[left] < height[right] ? height[left] : height[right]; if(height[left] == min){ left++; while(left < right && height[left] < min){ result += (min - height[left]); left++; } }else { right--; while(left < right && height[right] < min){ result += (min - height[right]); right--; } } } return result; }
- leetcode 堆栈
- LeetCode 之堆栈 stack
- leetcode刷题-堆栈
- leetcode刷题-堆栈2
- leetcode刷题-堆栈3
- LeetCode-20-Valid Parentheses(堆栈)-Easy
- 堆栈
- 堆栈
- 堆栈
- 堆栈
- 堆栈
- 堆栈
- 堆栈
- 堆栈
- 堆栈
- 堆栈
- 堆栈
- 堆栈
- 用wxpython写了一个邮件群发的桌面程序
- 程囧(三)
- 使用 linux 下的 TC 进行服务器流量控制
- HorizontalScrollView与ViewPager联合使用滚动屏幕以及其中涉及到的小知识
- 微信小程序开发之麦克风动画 帧动画 放大 淡出
- leetcode 堆栈
- 决策树的完整知识点总结
- laraver框架的增删改查
- Servlet学习笔记(四)之请求转发与重定向(RequestDispatcher与sendRedirect)
- C++生成-1到1之间的随机小数
- Linux TEQL (True Link Equalizer)
- Servlet
- RSTP、 EtherChannel、私有VLAN等做一下总结笔记
- jquery$().each和$.each()遍历的区别