leetcode-simple+medium+difficult-共25题-04

76.删除字符串中的所有相邻重复项

package com.lxh.simple;
import java.util.Stack;

/**
 * @Author: Tiger
 * @Description: 删除字符串中的所有相邻重复项
 * 1. 时间43ms 击败25.35% 内存39.3MB 击败30.23%
 * 2. 附 String.copyValueOf(char[] data, int offset, int count):(注意是字符数组)
 *    str1 = str1.copyValueOf(char[] data, int offset, int count)
 *    它使用指定的偏移量和计数值仅将指定的字符复制到字符串。
 *    offset是需要复制字符的初始索引,count是要复制的字符数。
 * @Date: 下午 14:43 2021/11/10 0010
 **/
public class RemoveAllAdjacentDuplicates1047 {
    public String removeDuplicates(String s) {
        Stack<Character> stack = new Stack<>();
        StringBuilder result = new StringBuilder();
        stack.push('0');

        for (char ch : s.toCharArray()) {
            if (ch != stack.peek()) {
                stack.push(ch);
            }else {
                stack.pop();
            }
        }

        while (stack.peek() != '0') {
            result.append(stack.pop());
        }

        s = new String(result.reverse());
        return s;
    }
}

/*
class Solution {
    public String removeDuplicates(String s) {
        char[] chars = s.toCharArray();
        int slow = 0, fast = 0;
        while (fast < chars.length) {
            chars[slow] = chars[fast];
            //前后值相同,slow回退,下一次循环时会被fast指向的元素覆盖
            if (slow > 0 && chars[slow] == chars[slow - 1]) {
                slow--;
            } else {
                slow++;
            }
            fast++;
        }
        //String.copyValueOf(chars, 0, slow) 将chars字符数组中从0开始数到slow位置的字符串复制出来
        return String.copyValueOf(chars, 0, slow);
    }
}*/

77.用栈操作构建数组

package com.lxh.simple;

import java.util.LinkedList;
import java.util.List;

/**
 * @Author: Tiger
 * @Description: 用栈操作构建数组
 * 1. 时间0ms 击败100% 内存38.5MB 击败65.34%
 * @Date: 下午 15:31 2021/11/10 0010
 **/
public class BuildArrayWithStackOperations1441 {
    public List<String> buildArray(int[] target, int n) {
        List<String> result = new LinkedList<>();
        int j = 0;
        for (int i = 1; i <= n; i++) {
            if (i != target[j]) {
                result.add("Push");
                result.add("Pop");
            }else {
                result.add("Push");
                j++;
            }
            if (j == target.length)
                break;
        }
        return result;
    }
}

78.商品折扣后的最终价格

package com.lxh.simple;

import java.util.Stack;

/**
 * @Author: Tiger
 * @Description: 商品折扣后的最终价格
 * 1. 时间3ms 击败44.83% 内存38.6MB 击败32.50%
 * @Date: 下午 15:59 2021/11/10 0010
 **/
public class FinalPricesWithSpecialDiscount1475 {
    public int[] finalPrices(int[] prices) {
        int[] result = new int[prices.length];
        Stack<Integer> stack = new Stack<>();
        for (int i = 0; i < prices.length; i++) {
            while (!stack.empty() && prices[i] <= prices[stack.peek()]) {
                int prev = stack.pop();
                result[prev] = prices[prev] - prices[i];
            }
            stack.push(i);
        }
        while (!stack.empty()) {
            int prev = stack.pop();
            result[prev] = prices[prev];
        }
        return result;
    }
}

79.整理字符串

package com.lxh.simple;

import java.util.Stack;

/**
 * @Author: Tiger
 * @Description: 整理字符串
 * 1. 时间3ms 击败34.67% 内存38.6MB 击败16.09%
 * @Date: 下午 16:16 2021/11/10 0010
 **/
public class MakeTheStringGreat1544 {
    public String makeGood(String s) {
        StringBuilder str = new StringBuilder();
        Stack<Character> stack = new Stack<>();
        for (char ch : s.toCharArray()) {
            if (!stack.empty() && (ch - 32 == stack.peek() || ch + 32 == stack.peek())) {
                stack.pop();
            }else {
                stack.push(ch);
            }
        }
        while (!stack.empty()) {
            str.append(stack.pop());
        }
        return str.reverse().toString();
    }

    public static void main(String[] args) {
        MakeTheStringGreat1544 mtsg1544 = new MakeTheStringGreat1544();
        String s1 = "leEeetcode";
        System.out.println(mtsg1544.makeGood(s1));
    }
}

/* 时间1ms 栈会慢一点 其他方法或许会更快一点
class Solution {
    public String makeGood(String s) {
        StringBuilder sb = new StringBuilder();
        for (char ch: s.toCharArray()
        ) {
            if (sb.length()>0 && Math.abs(ch - sb.charAt(sb.length()-1))==32){
                //删除字符
                sb.deleteCharAt(sb.length()-1);
            } else {
                sb.append(ch);
            }
        }
        return sb.toString();
    }
}*/

80.逆波兰表达式求值

package com.lxh.medium;

import java.util.Stack;

/**
 * @Author: Tiger
 * @Description: 逆波兰表达式求值
 * 1. 时间5ms 击败91.02% 内存38.2MB 击败32.62%
 * @Date: 下午 17:03 2021/11/10 0010
 **/
public class EvaluateReversePolishNotation0150 {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        for (String token : tokens) {
            switch (token) {
                case "+":
                case "-":
                case "*":
                case "/":
                    int num1 = stack.pop();
                    int num2 = stack.pop();
                    int num = getResult(num2, num1, token);
                    stack.push(num);
                    break;
                default:
                    stack.push(Integer.parseInt(token));
            }
        }
        return stack.peek();
    }

    private int getResult(int num1, int num2, String token) {
        switch (token) {
            case "+":
                return num1 + num2;
            case "-":
                return num1 - num2;
            case "*":
                return num1 * num2;
            case "/":
                return num1 / num2;
        }
        return -1;
    }

}

81.基本计算器

package com.lxh.medium;

import java.util.Stack;

/**
 * @Author: Tiger
 * @Description: 基本计算器
 * 1. 时间28ms 击败8.91% 内存39.9MB 击败50.18% 实现了后缀表达式+中缀表达式的计算
 * @Date: 下午 19:13 2021/11/10 0010
 **/
public class BasicCalculatorII0227 {
    public int calculate(String s) {
        Stack<Integer> stackNum = new Stack<>();
        Stack<Character> stackOps = new Stack<>();
        String t = "";

        for (int i = 0; i < s.length(); i++) {
            switch (s.charAt(i)) {
                case '+':
                case '-':
                    stackNum.push(Integer.parseInt(t));
                    while (!stackOps.empty()) {
                        getStack(stackNum, stackOps);
                    }
                    stackOps.push(s.charAt(i));
                    t = "";
                    break;
                case '*':
                case '/':
                    stackNum.push(Integer.parseInt(t));
                    while (!stackOps.empty() && (stackOps.peek() == '*' || stackOps.peek() == '/')) {
                        getStack(stackNum, stackOps);
                    }
                    stackOps.push(s.charAt(i));
                    t = "";
                    break;
                case ' ':
                    break;
                default:
                    t += s.charAt(i);
            }
        }
        stackNum.push(Integer.parseInt(t));
        while (!stackOps.empty()) {
            getStack(stackNum, stackOps);
        }
        int sum = 0;
        int count = 1;
        while (!stackNum.empty()) {
            sum += stackNum.pop()*count;
            count *= 10;
        }
        return sum;
    }

    private int getResult(int num1, int num2, char token) {
        switch (token) {
            case '+':
                return num1 + num2;
            case '-':
                return num1 - num2;
            case '*':
                return num1 * num2;
            case '/':
                return num1 / num2;
            default:
                return 0;
        }
    }

    private void getStack(Stack<Integer> stackNum, Stack<Character> stackOps) {
        int num1 = stackNum.pop();
        int num2 = stackNum.pop();
        char token = stackOps.pop();
        int num = getResult(num2, num1, token);
        stackNum.push(num);
    }

    public static void main(String[] args) {
        BasicCalculatorII0227 bcii0227 = new BasicCalculatorII0227();
        String s = "1*2-3/4+5*6-7*8+9/10";
        System.out.println(bcii0227.calculate(s));
    }
}

82.每日温度

package com.lxh.medium;

import java.util.Stack;

/**
 * @Author: Tiger
 * @Description: 每日温度
 * 1. 时间37ms 击败40.46% 内存47.6MB 击败82.25%
 * @Date: 下午 13:02 2021/11/11 0011
 **/
public class DailyTemperatures0739 {
    public int[] dailyTemperatures(int[] temperatures) {
        Stack<Integer> stack = new Stack<>();
        int[] result = new int[temperatures.length];
        for (int i = 0; i < temperatures.length; i++) {
            while (!stack.empty() && temperatures[i] > temperatures[stack.peek()]) {
                int prev =  i - stack.peek();
                result[stack.pop()] = prev;
            }
            stack.push(i);
        }
        return result;
    }
}

83.行星碰撞

package com.lxh.medium;

import java.util.Stack;

/**
 * @Author: Tiger
 * @Description: 行星碰撞
 * 1. 时间 10ms 击败11.90% 内存39.3MB 击败25.97%
 * @Date: 下午 14:28 2021/11/11 0011
 **/
public class AsteroidCollision0735 {
    public int[] asteroidCollision(int[] asteroids) {
        Stack<Integer> stack = new Stack<>();
        for (int as : asteroids) {
            while (!stack.empty() && stack.peek() > 0 && stack.peek() < -as) {
                stack.pop();
            }

            if (!stack.empty() && as < 0 && stack.peek() == -as) {
                stack.pop();
            }else if (stack.empty() || stack.peek() < 0 || as > 0) {
                stack.push(as);
            }
        }
        return stack.stream().mapToInt(i->i).toArray();
    }
}

84.移掉K位数字

package com.lxh.medium;

import java.util.Stack;

/**
 * @Author: Tiger
 * @Description: 移掉K位数字
 * 1. 时间10ms 击败40.84% 内存39MB 击败25.50%
 * 2. 要学会对各种遇到的情况进行判断 尤其是一些边界问题
 * @Date: 下午 15:03 2021/11/11 0011
 **/
public class RemoveKDigits0402 {
    public String removeKdigits(String num, int k) {
        Stack<Character> stack = new Stack<>();
        StringBuilder result = new StringBuilder();

        if (num.length() == k)
            return "0";

        for (char ch : num.toCharArray()) {
            while (!stack.empty() && ch < stack.peek() && k > 0) {
                stack.pop();
                k--;
            }
            if (stack.empty() && ch == '0') {
                continue;
            }
            stack.push(ch);
        }

        while (k > 0 && !stack.empty()) {
            stack.pop();
            k--;
        }

        if (stack.empty())
            result.append(0);

        while (!stack.empty()) {
            result.append(stack.pop());
        }

        return new String(result.reverse());
    }

    public static void main(String[] args) {
        RemoveKDigits0402 rkd0402 = new RemoveKDigits0402();
        String s = "10200";
        System.out.println(rkd0402.removeKdigits(s, 1));
    }
}

85.链表中的下一个更大节点

package com.lxh.medium;

import com.lxh.list.ListNode;

import java.util.Stack;

/**
 * @Author: Tiger
 * @Description: 链表中的下一个更大节点
 * 1. 时间16ms 击败64.83% 内存42.7MB 击败44.65%
 * @Date: 下午 16:42 2021/11/11 0011
 **/
public class NextGreaterNodeInLinkedList1019 {
    public int[] nextLargerNodes(ListNode head) {
        ListNode cur = head;
        int len = 0;

        while (cur != null) {
            len++;
            cur = cur.next;
        }

        int i = 0;
        cur = head;
        int[] result = new int[len];

        while (cur != null) {
            result[i++] = cur.val;
            cur =cur.next;
        }

        return getNum(result);
    }

    private int[] getNum(int[] nums) {
        Stack<Integer> stack = new Stack<>();
        int[] reNum = new int[nums.length];

        for (int i = 0; i < nums.length; i++) {
            while (!stack.empty() && nums[i] > nums[stack.peek()]) {
                int prev = stack.pop();
                reNum[prev] = nums[i];
            }
            stack.push(i);
        }

        return reNum;
    }
}

86.无法吃午餐的学生数量

package com.lxh.simple;

import java.util.LinkedList;
import java.util.Queue;

/**
 * @Author: Tiger
 * @Description: 无法吃午餐的学生数量
 * 1. 时间2ms 击败27% 内存36MB 击败87.04%
 * @Date: 下午 17:09 2021/11/13 0013
 **/
public class NumberStudentsUnableEatLunch1700 {
    public int countStudents(int[] students, int[] sandwiches) {
        Queue<Integer> queue = new LinkedList<>();
        int i = 0;
        int j = 0;
        int count = 0;

        for (int stu : students) {
            queue.offer(stu);
        }

        while (!queue.isEmpty()) {
            if (queue.peek() == sandwiches[i]) {
                queue.poll();
                i++;
                count = 0;
            }else {
                int cur = queue.poll();
                queue.offer(cur);
                count++;
            }
            if (count == queue.size()) {
                return count;
            }
        }
        return 0;
    }
}

87.滑动窗口最大值

package com.lxh.difficult;

import java.util.LinkedList;
import java.util.Queue;

/**
 * @Author: Tiger
 * @Description: 滑动窗口最大值
 * 1. 超出时间限制 需要进一步思考
 * @Date: 下午 18:16 2021/11/13 0013
 **/
public class SlidingWindowMaximum0239 {
    public int[] maxSlidingWindow(int[] nums, int k) {
        Queue<Integer> queue = new LinkedList<>();
        int[] count = new int[nums.length - k + 1];
        int i = 0;

        for (int num : nums) {
            queue.offer(num);
            if (queue.size() == k) {
                count[i++] = maxValue(queue, k);
                queue.poll();
            }
        }

        return count;
    }

    private int maxValue(Queue<Integer> queue, int k) {
        int max = Integer.MIN_VALUE;
        int flag = 0;
        while (flag < k) {
            int cur = queue.poll();
            if (cur >= max) {
                max = cur;
            }
            queue.offer(cur);
            flag++;
        }
        return max;
    }
}

88.相同的树

package com.lxh.simple;

import com.lxh.method.TreeNode;

/**
 * @Author: Tiger
 * @Description: 相同的树
 * 1. 时间0ms 击败100% 内存35.6MB 击败88.05% 递归算法 again
 * @Date: 下午 21:12 2021/11/13 0013
 **/
public class SameTree0100 {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if (p == null && q == null) return true;
        if (p == null) return false;
        if (q == null) return false;
        if (p.val == q.val) {
            return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
        } else {
            return false;
        }
    }
}

89.二叉树的最小深度

package com.lxh.simple;

import com.lxh.method.TreeNode;

import java.util.LinkedList;
import java.util.Queue;

/**
 * @Author: Tiger
 * @Description: 二叉树的最小深度
 * 1. 时间1ms 击败99.30% 内存57.9MB 击败89.79%
 * @Date: 下午 21:56 2021/11/13 0013
 **/
public class MinimumDepthBinaryTree0111 {
    public int minDepth(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList<>();
        int minDep = 1;
        int cur = 0;
        int count = 1;

        if (root != null) {
            queue.offer(root);
        }else {
            return 0;
        }

        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            count--;

            if (node.left == null && node.right == null) {
                return minDep;
            }

            if (node.left != null) {
                queue.offer(node.left);
                cur++;
            }

            if (node.right != null) {
                queue.offer(node.right);
                cur++;
            }

            if (count == 0) {
                minDep++;
                count = cur;
                cur = 0;
            }
        }

        return minDep;
    }
}

90.二叉树的右视图

package com.lxh.medium;

import com.lxh.method.TreeNode;

import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * @Author: Tiger
 * @Description: 二叉树的右视图
 * 1. 时间1ms 击败83.26% 内存36.9MB 击败85.24%
 * @Date: 下午 22:25 2021/11/13 0013
 **/
public class BinaryTreeRightSideView0199 {
    public List<Integer> rightSideView(TreeNode root) {
        Queue<TreeNode> queue1 = new LinkedList<>();
        Queue<TreeNode> queue2 = new LinkedList<>();

        List<Integer> result = new LinkedList<>();

        if (root == null) {
            return result;
        }

        queue1.offer(root);

        while (!queue1.isEmpty()) {
            TreeNode node = queue1.poll();

            if (node.left != null) {
                queue2.offer(node.left);
            }

            if (node.right != null) {
                queue2.offer(node.right);
            }

            if (queue1.isEmpty()) {
                result.add(node.val);
                queue1 = queue2;
                queue2 = new LinkedList<>();
            }
        }

        return result;
    }
}

91.二叉树的层序遍历

package com.lxh.medium;

import com.lxh.method.TreeNode;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * @Author: Tiger
 * @Description: 二叉树的层序遍历
 * 1. 时间1ms 击败90.73% 内存38.5MB 击败80.72%
 * @Date: 下午 19:50 2021/11/14 0014
 **/
public class BinaryTreeLevelOrderTraversal0102 {
    public List<List<Integer>> levelOrder(TreeNode root) {
        Queue<TreeNode> queue1 = new LinkedList<>();
        Queue<TreeNode> queue2 = new LinkedList<>();
        List<List<Integer>> result = new ArrayList<>();
        List<Integer> temp = new ArrayList<>();

        if (root != null) {
            queue1.offer(root);
        }

        while (!queue1.isEmpty()) {
            TreeNode node = queue1.poll();
            temp.add(node.val);

            if (node.left != null) {
                queue2.offer(node.left);
            }

            if (node.right != null) {
                queue2.offer(node.right);
            }

            if (queue1.isEmpty()) {
                queue1 = queue2;
                queue2 = new LinkedList<>();

                result.add(temp);
                temp = new ArrayList<>();
            }
        }

        return result;
    }
}

92.二叉树的锯齿形层序遍历

package com.lxh.medium;

import com.lxh.method.TreeNode;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * @Author: Tiger
 * @Description: 二叉树的锯齿形层序遍历
 * 1. 时间1ms 击败93.35% 内存38.3MB 击败91.91%
 * @Date: 下午 20:10 2021/11/14 0014
 **/
public class BinaryTreeZigzagLevelOrderTraversal0103 {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        Queue<TreeNode> queue1 = new LinkedList<>();
        Queue<TreeNode> queue2 = new LinkedList<>();
        List<List<Integer>> result = new ArrayList<>();
        List<Integer> temp = new ArrayList<>();
        int depth = 1;

        if (root != null) {
            queue1.offer(root);
        }

        while (!queue1.isEmpty()) {
            TreeNode node = queue1.poll();
            temp.add(node.val);

            if (node.left != null) {
                queue2.offer(node.left);
            }

            if (node.right != null) {
                queue2.offer(node.right);
            }

            if (queue1.isEmpty()) {
                queue1 = queue2;
                queue2 = new LinkedList<>();
                if (depth % 2 == 0) {
                    temp = reverse(temp);
                }
                result.add(temp);
                temp = new ArrayList<>();
                depth++;
            }
        }

        return result;
    }

    private List<Integer> reverse(List<Integer> temp) {
        List<Integer> reverseTemp = new ArrayList<>();

        for (int i = temp.size() - 1; i >= 0; i--) {
            reverseTemp.add(temp.get(i));
        }

        return reverseTemp;
    }
}

93.二叉树的层序遍历II

package com.lxh.medium;

import com.lxh.method.TreeNode;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * @Author: Tiger
 * @Description: 二叉树的层序遍历II (倒着输出)
 * 1. 时间1ms 击败94.80% 内存38.6MB 击败42.41%
 * @Date: 下午 20:17 2021/11/14 0014
 **/
public class BinaryTreeLevelOrderTraversalII0107 {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        Queue<TreeNode> queue1 = new LinkedList<>();
        Queue<TreeNode> queue2 = new LinkedList<>();
        List<List<Integer>> result = new ArrayList<>();
        List<Integer> temp = new ArrayList<>();

        if (root != null) {
            queue1.offer(root);
        }

        while (!queue1.isEmpty()) {
            TreeNode node = queue1.poll();
            temp.add(node.val);

            if (node.left != null) {
                queue2.offer(node.left);
            }

            if (node.right != null) {
                queue2.offer(node.right);
            }

            if (queue1.isEmpty()) {
                queue1 = queue2;
                queue2 = new LinkedList<>();
                result.add(temp);
                temp = new ArrayList<>();
            }
        }

        return reverse(result);
    }

    private List<List<Integer>> reverse(List<List<Integer>> result) {
        List<List<Integer>> reverseResult = new ArrayList<>();

        for (int i = result.size() - 1; i >= 0; i--) {
            reverseResult.add(result.get(i));
        }

        return reverseResult;
    }
}

94.在每个树行中找最大值

package com.lxh.medium;

import com.lxh.method.TreeNode;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * @Author: Tiger
 * @Description: 在每个树行中找最大值
 * 1. 时间3ms 击败17.02% 内存38.7MB 击败40.09%
 * 2. 附 递归解法
 * @Date: 下午 20:47 2021/11/14 0014
 **/
public class FindLargestValueEachTreeRow0515 {
    public List<Integer> largestValues(TreeNode root) {
        Queue<TreeNode> queue1 = new LinkedList<>();
        Queue<TreeNode> queue2 = new LinkedList<>();
        List<Integer> res = new ArrayList<>();
        int max = Integer.MIN_VALUE;

        if (root != null) {
            queue1.offer(root);
        }

        while (!queue1.isEmpty()) {
            TreeNode node = queue1.poll();
            max = Math.max(max, node.val);

            if (node.left != null) {
                queue2.offer(node.left);
            }

            if (node.right != null) {
                queue2.offer(node.right);
            }

            if (queue1.isEmpty()) {
                res.add(max);
                max = Integer.MIN_VALUE;
                queue1 = queue2;
                queue2 = new LinkedList<>();
            }
        }

        return res;
    }
}

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
/* 递归解法
class Solution {
    // List<List<Integer>> res = new ArrayList();
    List<Integer> res = new ArrayList();
    public void helper(TreeNode node,int deep){
        // if(res.size()<deep){
        //     res.add(new ArrayList());
        // }
        if(res.size()<deep){
            res.add(deep-1,node.val);
        }else{
            int max = (node.val>res.get(deep-1))?node.val:res.get(deep-1);
            res.set(deep-1,max);
        }

        if(node.left!=null){
            helper(node.left,deep+1);
        }
        if(node.right!=null){
            helper(node.right,deep+1);
        }
    }
    public List<Integer> largestValues(TreeNode root) {
        if(root==null) return res;
        helper(root,1);
        return res;
    }
}*/

95.二叉树的层平均值

package com.lxh.simple;

import com.lxh.method.TreeNode;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * @Author: Tiger
 * @Description: 二叉树的层平均值
 * 1. 时间3ms 击败28.88% 内存40.4MB 击败33.26%
 * @Date: 下午 21:14 2021/11/14 0014
 **/
public class AverageLevelsBinaryTree0637 {
    public List<Double> averageOfLevels(TreeNode root) {
        Queue<TreeNode> queue1 = new LinkedList<>();
        Queue<TreeNode> queue2 = new LinkedList<>();
        List<Double> res = new ArrayList<>();
        double average = 0;
        int flag = 0;
        int len = 0;

        if (root != null) {
            queue1.offer(root);
        }

        while (!queue1.isEmpty()) {

            TreeNode node = queue1.poll();
            average += node.val;

            if (node.left != null) {
                queue2.offer(node.left);
            }

            if (node.right != null) {
                queue2.offer(node.right);
            }

            if (queue1.isEmpty()) {
                if (flag == 0) {
                    res.add(average);
                }else {
                    res.add(average / len);
                }
                len = queue2.size();
                queue1 = queue2;
                queue2 = new LinkedList<>();
                flag = 1;
                average = 0;
            }
        }

        return res;
    }
}

96.单值二叉树

package com.lxh.simple;

import com.lxh.method.TreeNode;

import java.util.LinkedList;
import java.util.Queue;

/**
 * @Author: Tiger
 * @Description: 单值二叉树
 * 1. 时间0ms 击败100% 内存35.9MB 击败54.83%
 * @Date: 下午 21:44 2021/11/14 0014
 **/
public class UnivaluedBinaryTree0965 {
    public boolean isUnivalTree(TreeNode root) {
        Queue<TreeNode> queue1 = new LinkedList<>();
        Queue<TreeNode> queue2 = new LinkedList<>();

        if (root != null) {
            queue1.offer(root);
        }

        while (!queue1.isEmpty()) {
            TreeNode node = queue1.poll();

            if (node.left != null) {
                if (node.val != node.left.val) {
                    return false;
                }
                queue2.offer(node.left);
            }

            if (node.right != null) {
                if (node.val != node.right.val) {
                    return false;
                }
                queue2.offer(node.right);
            }

            if (queue1.isEmpty()) {
                queue1 = queue2;
                queue2 = new LinkedList<>();
            }
        }

        return true;
    }
}

97.最大层内元素和

package com.lxh.medium;

import com.lxh.method.TreeNode;

import java.util.LinkedList;
import java.util.Queue;

/**
 * @Author: Tiger
 * @Description: 最大层内元素和
 * 1. 时间12ms 击败11.15% 内存41.3MB 击败47.96%
 * 2. 附 3ms 的代码
 * @Date: 下午 22:03 2021/11/14 0014
 **/
public class MaximumLevelSumBinaryTree1161 {
    public int maxLevelSum(TreeNode root) {
        Queue<TreeNode> queue1 = new LinkedList<>();
        Queue<TreeNode> queue2 = new LinkedList<>();
        int sumPrev = 0;
        int sumMax = Integer.MIN_VALUE;
        int treeDepth = 0;
        int depth = 1;

        if (root != null) {
            queue1.offer(root);
        }

        while (!queue1.isEmpty()) {
            TreeNode node = queue1.poll();
            sumPrev += node.val;

            if (node.left != null) {
                queue2.offer(node.left);
            }

            if (node.right != null) {
                queue2.offer(node.right);
            }

            if (queue1.isEmpty()) {
                if (sumPrev > sumMax) {
                    sumMax = sumPrev;
                    treeDepth = depth;
                }
                queue1 = queue2;
                queue2 = new LinkedList<>();
                sumPrev = 0;
                depth++;
            }
        }

        return treeDepth;
    }
}

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */

/* 运行时间3ms
class Solution {
    int[] levelSum = new int[10001];
    int depth=0;//记录节点深度
    public void inorder(TreeNode node, int level) {
        if (node != null) {
            inorder(node.left, level + 1);
            levelSum[level] += node.val;
            inorder(node.right, level + 1);
            depth=Math.max(depth,level);
        }
    }
    public int maxLevelSum(TreeNode root) {
        inorder(root, 1);
        int maxIdx = depth;
        for (int i = depth; i>=1;i--){//从最深的那一块开始遍历
            if( levelSum[i] > levelSum[maxIdx])//和官方的三元运算符一样
                maxIdx=i;
            else if(levelSum[i]==levelSum[maxIdx])//题目要求如果和一样,则返回最小层数
                maxIdx=i;
        }
        return maxIdx;
    }
}*/

98.层数最深叶子节点的和

package com.lxh.medium;

import com.lxh.method.TreeNode;

import java.util.LinkedList;
import java.util.Queue;

/**
 * @Author: Tiger
 * @Description: 层数最深叶子节点的和
 * 1. 时间10ms 击败6.86% 内存39.7MB 击败64.42%
 * 2. 本次使用的是广度优先搜索 可以考虑用下 深度优先搜素试一试
 * 3. 目前从很多题目来看 深度优先搜索(采用的递归)耗时最少
 * @Date: 下午 13:55 2021/11/15 0015
 **/
public class DeepestLeavesSum1302 {
    public int deepestLeavesSum(TreeNode root) {
        Queue<TreeNode> queue1 = new LinkedList<>();
        Queue<TreeNode> queue2 = new LinkedList<>();
        int lastSum = 0;
        int curSum = 0;

        if (root != null) {
            queue1.offer(root);
        }

        while (!queue1.isEmpty()) {
            TreeNode node = queue1.poll();
            curSum += node.val;

            if (node.left != null) {
                queue2.offer(node.left);
            }

            if (node.right != null) {
                queue2.offer(node.right);
            }

            if (queue1.isEmpty()) {
                lastSum = curSum;
                queue1 = queue2;
                queue2 = new LinkedList<>();
                curSum = 0;
            }
        }

        return lastSum;
    }
}


99.开幕式焰火

package com.lxh.simple;

import com.lxh.method.TreeNode;

import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;

/**
 * @Author: Tiger
 * @Description: 开幕式焰火
 * 1. 时间4ms 击败16.30% 内存37.9MB 击败93.72%
 * @Date: 下午 14:39 2021/11/15 0015
 **/
public class OpeningCeremonyFireworks0044 {
    public int numColor(TreeNode root) {
        Queue<TreeNode> queue1 = new LinkedList<>();
        Set<Integer> numColor = new HashSet<>();

        queue1.offer(root);

        while (!queue1.isEmpty()) {
            TreeNode node = queue1.poll();
            numColor.add(node.val);

            if (node.left != null) {
                queue1.offer(node.left);
            }

            if (node.right != null) {
                queue1.offer(node.right);
            }
        }

        return numColor.size();
    }
}

100.二叉树的中序遍历(前序和后续对于递归就是调换顺序)

package com.lxh.simple;

import com.lxh.method.TreeNode;

import java.util.LinkedList;
import java.util.List;
import java.util.Stack;

/**
 * @Author: Tiger
 * @Description: 二叉树的中序遍历(前序和后续对于递归就是调换顺序)
 * 1. 递归 时间0ms 击败100% 内存36.5MB 击败78.86%
 * 2. 迭代 时间0ms 击败100% 内存36.5MB 击败80.65%
 * @Date: 下午 16:22 2021/11/15 0015
 **/
public class BinaryTreeInorderTraversal0094 {
    /* 递归
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> nodes = new LinkedList<>();
        dfs(root, nodes);
        return nodes;
    }

    private void dfs(TreeNode root, List<Integer> nodes) {
        if (root != null) {
            dfs(root.left, nodes);
            nodes.add(root.val);
            dfs(root.right, nodes);
        }
    }*/

    //非递归
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> nodes = new LinkedList<>();
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;

        while (cur != null || !stack.isEmpty()) {
            while (cur != null) {
                stack.push(cur);
                cur = cur.left;
            }

            cur = stack.pop();
            nodes.add(cur.val);
            cur = cur.right;
        }

        return nodes;
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值