739. 每日温度

image.png

  • 单调栈:遇到比自己高的弹出
    • 一个记录还没有遇到比自己高的温度的温度
    • 一个记录温度栈中温度的位置
    • 定义一个数组,存储结果
      1. class Solution {
      2. public int[] dailyTemperatures(int[] T) {
      3. Stack<Integer> temp = new Stack(); // 存放未确定的温度
      4. Stack<Integer> pos = new Stack(); // 存放未确定温度的位置
      5. int index = 0;
      6. int len = T.length;
      7. int[] res = new int[len]; // 存放结果
      8. while(index<len) {
      9. // 当前温度栈中已经遇到比自己高德温度了,可以弹出
      10. while(!temp.isEmpty() && temp.peek()<T[index]) {
      11. temp.pop();
      12. int p = pos.pop();
      13. res[p] = index-p;
      14. }
      15. temp.push(T[index]); // 加入新的温度
      16. pos.push(index); //记录新温度的位置
      17. index++;
      18. }
      19. while(!pos.isEmpty()) {
      20. res[pos.pop()] = 0; // 当前栈中的温度都没有遇到比自己温度高的温度
      21. }
      22. return res;
      23. }
      24. }

      113. 路径总和 II

      image.png
      1. class Solution {
      2. List<List<Integer>> res = new ArrayList<>();
      3. List<Integer> list = new ArrayList<>();
      4. public List<List<Integer>> pathSum(TreeNode root, int sum) {
      5. dfs(root, 0, sum);
      6. return res;
      7. }
      8. public void dfs(TreeNode root, int num, int sum){
      9. if(root == null) return;
      10. num += root.val;
      11. list.add(root.val);
      12. if(num == sum && root.left == null && root.right == null) res.add(new ArrayList(list));
      13. dfs(root.left, num, sum);
      14. dfs(root.right, num, sum);
      15. list.remove(list.size() - 1);
      16. }
      17. }

      48. 旋转图像

      image.png
      image.png
  1. class Solution {
  2. public void rotate(int[][] matrix) {
  3. int n = matrix.length;
  4. // 水平翻转
  5. for (int i = 0; i < n / 2; ++i) {
  6. for (int j = 0; j < n; ++j) {
  7. int temp = matrix[i][j];
  8. matrix[i][j] = matrix[n - i - 1][j];
  9. matrix[n - i - 1][j] = temp;
  10. }
  11. }
  12. // 主对角线翻转
  13. for (int i = 0; i < n; ++i) {
  14. for (int j = 0; j < i; ++j) {
  15. int temp = matrix[i][j];
  16. matrix[i][j] = matrix[j][i];
  17. matrix[j][i] = temp;
  18. }
  19. }
  20. }
  21. }
  22. 作者:LeetCode-Solution
  23. 链接:https://leetcode-cn.com/problems/rotate-image/solution/xuan-zhuan-tu-xiang-by-leetcode-solution-vu3m/
  24. 来源:力扣(LeetCode
  25. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

215. 数组中的第K个最大元素

image.png
快速排序

  1. class Solution {
  2. public int findKthLargest(int[] nums, int k) {
  3. return find(nums,0,nums.length-1,nums.length-k);
  4. }
  5. public int find(int[] nums,int start,int end,int k) {
  6. if(start==end)
  7. return nums[start];
  8. int f = nums[start];
  9. int l = start;
  10. int r = end;
  11. while(l<r) {
  12. while(l<r && nums[r]>=f)
  13. r--;
  14. while(l<r && nums[l]<=f)
  15. l++;
  16. if(l<r) {
  17. int t = nums[l];
  18. nums[l] = nums[r];
  19. nums[r] = t;
  20. }
  21. }
  22. nums[start] = nums[l];
  23. nums[l] = f;
  24. if(l==k) {
  25. return f;
  26. } else if(l>k) {
  27. return find(nums,start,l-1,k);
  28. } else {
  29. return find(nums,l+1,end,k);
  30. }
  31. }
  32. }

230. 二叉搜索树中第K小的元素

image.png

  • 中序遍历

    1. class Solution {
    2. public int kthSmallest(TreeNode root, int k) {
    3. return find(root,k);
    4. }
    5. int find(TreeNode root,int k) {
    6. Stack<TreeNode> stack = new Stack();
    7. TreeNode now = root;
    8. while(!stack.isEmpty() || root!=null) {
    9. while(now!=null) {
    10. stack.push(now);
    11. now=now.left;
    12. }
    13. now = stack.pop();
    14. k--;
    15. if(k==0)
    16. return now.val;
    17. now = now.right;
    18. }
    19. return -1;
    20. }
    21. }

    84. 柱状图中最大的矩形

    image.png

  • 计算出当前节点的左边界

  • 计算出当前节点的右边界

    1. class Solution {
    2. public int largestRectangleArea(int[] heights) {
    3. int len = heights.length;
    4. int[] L = new int[len];
    5. int[] R = new int[len];
    6. Stack<Integer> stackL = new Stack();
    7. Stack<Integer> stackR = new Stack();
    8. stackL.push(-1);
    9. for(int i = 0; i < heights.length ; i++) {
    10. while(stackL.peek()!= -1 && heights[stackL.peek()]>=heights[i]) {
    11. stackL.pop();
    12. }
    13. L[i] = stackL.peek();
    14. stackL.push(i);
    15. }
    16. stackR.push(len);
    17. for(int i = len-1;i>=0;i--) {
    18. while(stackR.peek()!=len && heights[stackR.peek()]>=heights[i]) {
    19. stackR.pop();
    20. }
    21. R[i] = stackR.peek();
    22. stackR.push(i);
    23. }
    24. // System.out.println(Arrays.toString(L));
    25. // System.out.println(Arrays.toString(R));
    26. int max = 0;
    27. for(int i = 0 ;i < len;i++) {
    28. max = Math.max(max,(R[i]-L[i]-1)*heights[i]);
    29. }
    30. return max;
    31. }
    32. }