leetcode155 最小栈

  1. class MinStack {
  2. private Stack<Integer> stack;
  3. /** initialize your data structure here. */
  4. public MinStack() {
  5. stack = new Stack<>();
  6. }
  7. public void push(int val) {
  8. if(stack.isEmpty()){
  9. stack.push(val);
  10. stack.push(val);
  11. }else{
  12. int temp = stack.peek();
  13. stack.push(val);
  14. if(temp>val){
  15. stack.push(val);
  16. }else{
  17. stack.push(temp);
  18. }
  19. }
  20. }
  21. public void pop() {
  22. stack.pop();
  23. stack.pop();
  24. }
  25. public int top() {
  26. return stack.get(stack.size()-2);
  27. }
  28. public int getMin() {
  29. return stack.peek();
  30. }
  31. }

leetcode739 每日温度

  1. //v1.0 暴力解法时间复杂度O(n^2)
  2. class Solution {
  3. public int[] dailyTemperatures(int[] temperatures) {
  4. int[] res = new int[temperatures.length];
  5. for(int i=0;i<temperatures.length-1;i++){
  6. for(int j=i+1;j<temperatures.length;j++){
  7. if(temperatures[j]>temperatures[i]){
  8. res[i] = j-i;
  9. break;
  10. }
  11. }
  12. }
  13. return res;
  14. }
  15. }
  16. //v2.0 利用栈
  17. class Solution {
  18. public int[] dailyTemperatures(int[] temperatures) {
  19. int len = temperatures.length;
  20. int[] res = new int[len];
  21. //维护一个队列,保存的是数组的下标
  22. Stack<Integer> stack = new Stack<Integer>();
  23. stack.push(0);
  24. for(int i=1;i<len;i++){
  25. while((!stack.isEmpty())&&temperatures[i]>temperatures[stack.peek()]){
  26. int temp = stack.pop();
  27. res[temp] = i-temp;
  28. }
  29. stack.push(i);
  30. }
  31. return res;
  32. }
  33. }

剑指59-I 滑动窗口最大值

  1. class Solution {
  2. public int[] maxSlidingWindow(int[] nums, int k) {
  3. if(nums.length==0||k==0) return new int[0];
  4. Deque<Integer> deque = new LinkedList<Integer>();
  5. int[] res = new int[nums.length-k+1];
  6. for(int i=1-k,j=0;j<nums.length;j++,i++){
  7. if(i>0&&deque.peekFirst()==nums[i-1]){
  8. deque.removeFirst();
  9. }
  10. while(!deque.isEmpty()&&deque.peekLast()<nums[j]){
  11. deque.removeLast();
  12. }
  13. deque.addLast(nums[j]);
  14. if(j>=k-1){
  15. res[j-k+1] = deque.peekFirst();
  16. }
  17. }
  18. return res;
  19. }
  20. }

leetcode42 接雨水

  1. class Solution {
  2. public int trap(int[] height) {
  3. Stack<Integer> stack = new Stack<>();
  4. int len = height.length;
  5. int res = 0;
  6. int current=0;
  7. while(current<len){
  8. while(!stack.isEmpty()&&height[stack.peek()]<height[current]){
  9. int top = stack.pop();
  10. if(stack.isEmpty()){
  11. break;
  12. }
  13. int boundaryHeight = Math.min(height[current],height[stack.peek()])-height[top];
  14. int distance = current - stack.peek()-1;
  15. res += boundaryHeight*distance;
  16. }
  17. stack.push(current++);
  18. }
  19. return res;
  20. }
  21. }