首页 > 其他分享 >二刷Leetcode-Days02

二刷Leetcode-Days02

时间:2023-05-15 14:26:29浏览次数:53  
标签:stackOut return int res public 二刷 Days02 root Leetcode

栈和队列:

   /**
     * 232. 用栈实现队列
     * 队列的先进先出可以使用两个栈stackIn和stackOut来实现;
     * 出队列前,如果 stackOut 不为空,表示队列当前值在上一轮已进入 stackOut 中,还没有被消费掉
     * 若 stackOut 为空,也就是队列当前值还在 stackIn 中,为了确保先进先出,就将 stackIn 中全部 push 到 stackOut 里
     */
    class MyQueue {
        Stack<Integer> stackIn;
        Stack<Integer> stackOut;

        public MyQueue() {
            stackIn = new Stack<>();
            stackOut = new Stack<>();
        }

        public void push(int x) {
            stackIn.push(x);
        }

        public int pop() {
            dumpStackIn();
            return stackOut.pop();
        }

        public int peek() {
            dumpStackIn();
            return stackOut.peek();
        }

        public boolean empty() {
            return stackIn.isEmpty() && stackOut.isEmpty();
        }

        private void dumpStackIn() {
            if (!stackOut.isEmpty()) {
                return;
            }
            while (!stackIn.isEmpty()) {
                stackOut.push(stackIn.pop());
            }
        }
    }

二叉树:

   /**\
     * 深度遍历(前中后序,所谓前中后序,就是中间结点的位置决定的)
     * @param root
     * @return
     */
    public List<Integer> preorderTraversal(TreeNode root) {
        if (root == null) {
            return new ArrayList<>();
        }
        List<Integer> res = new ArrayList<>();
        preorder(root, res);
        return res;
    }

    public void preorder(TreeNode root, List<Integer> res) {
        if (root == null) {
            return;
        }
        res.add(root.val);
        preorder(root.left, res);
        preorder(root.right, res);
    }

    public void inorder(TreeNode root, List<Integer> res) {
        if (root == null) {
            return;
        }
        preorder(root.left, res);
        res.add(root.val);
        preorder(root.right, res);
    }

    public void postorder(TreeNode root, List<Integer> res) {
        if (root == null) {
            return;
        }
        preorder(root.left, res);
        res.add(root.val);
        preorder(root.right, res);
    }

回溯:

    /**
     * 77. 组合
     * @param n
     * @param k
     * @return 返回范围 [1, n] 中所有可能的 k 个数的组合。
     */
    public List<List<Integer>> combine(int n, int k) {
        List<List<Integer>> restlt = new ArrayList<>();
        LinkedList<Integer> path = new LinkedList<>();
        combine_backtracking(n, k, 1, restlt, path);
        return restlt;
    }

    /**
     * 每次从集合中选取元素,可选择的范围随着选择的进行而收缩,调整可选择的范围,就是要靠startIndex
     * @param startIndex 用来记录本层递归的中,集合从哪里开始遍历(集合就是[1,...,n] )。
     */
    public void combine_backtracking(int n, int k, int startIndex, List<List<Integer>> restlt, LinkedList<Integer> path) {
        // 终止条件(层数够了,就是二叉树中的遍历到叶子结点了)
        // n相当于树的宽度,k相当于树的深度。
        if (k == path.size()) {
            restlt.add(new ArrayList<>(path));
            return;
        }
        for (int i = startIndex; i <= n - (k - path.size()) + 1; i++) {
            path.add(i);
            combine_backtracking(n, k, i + 1, restlt, path);
            path.removeLast();
        }
    }

 

标签:stackOut,return,int,res,public,二刷,Days02,root,Leetcode
From: https://www.cnblogs.com/LinxhzZ/p/17401708.html

相关文章

  • 2023-05-15 leetcode周赛题
    找出转圈游戏输家mysolution100%passclassSolution:defcircularGameLosers(self,n:int,k:int)->List[int]:seen=set()now_num=1step=1seen.add(1)while1:stepSum=step*ktotal=now_num+stepSumnow_num=tot......
  • 【LeetCode字符串#extra】KMP巩固练习:旋转字符串、字符串轮转
    旋转字符串https://leetcode.cn/problems/rotate-string/给定两个字符串,s和goal。如果在若干次旋转操作之后,s能变成goal,那么返回true。s的旋转操作就是将s最左边的字符移动到最右边。例如,若s='abcde',在旋转一次之后结果就是'bcdea'。示例1:输入:s="......
  • leetcode1004
    1.二分查找法用一数组P【i】记录每个位置之前到自己本身位置i有多少个0,只要满足【下界,上界】之间的0个数小于等于k就可以连接成为连续的1。即P【上界】-P【下界】<=k因为第一个位置要是为0要做特殊处理[上界,下界]之间0的个数不能简单用P[上界]-P【下界】,记有n个元素,从P[0]~P......
  • LeetCode 347. 前 K 个高频元素
    题目链接:LeetCode347.前K个高频元素题意:给你一个整数数组nums和一个整数k,请你返回其中出现频率前k高的元素。你可以按任意顺序返回答案。解题思路:(哈希表,计数排序)O(n)首先用哈希表统计出所有数出现的次数。由于所有数出现的次数都在1到n之间,所以我们可以......
  • 代码随想录day4|leetcode24,19,142
    Leetcode24我一开始是直接模拟,通过考虑后面有没有secondpoint和thirdpoint的情况下进行的编程,非常的冗长。后面阅读了推荐的答案,发现在编写链表题目的时候,可以使用虚拟头节点,这样写出来的结果非常的简洁明了,并且一二两个就可以开始重复进行 关于判断语句的如果是and连接......
  • LeetCode 239. 滑动窗口最大值
    题目链接:LeetCode239.滑动窗口最大值题意:给你一个整数数组nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。解题思路:(单调队列)O(n)使用单调队列求解......
  • LeetCode 150. 逆波兰表达式求值
    题目链接:LeetCode150.逆波兰表达式求值题意:给你一个字符串数组tokens,表示一个根据逆波兰表示法表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。解题思路:(栈操作)O(n)遍历所有元素。如果当前元素是整数,则压入栈;如果是运算符,则将栈顶两个元素弹出......
  • LeetCode 1047. 删除字符串中的所有相邻重复项
    题目链接:LeetCode1047.删除字符串中的所有相邻重复项题意:给出由小写字母组成的字符串S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在S上反复执行重复项删除操作,直到无法继续删除。解题思路:开一个栈,然后扫描整个字符串。如果当前字符和栈顶元素不相等,则当前......
  • LeetCode 20. 有效的括号
    题目链接:LeetCode20.有效的括号题意:给定一个只包括'(',')','{','}','[',']'的字符串s,判断字符串是否有效。解题思路:括号匹配是栈的经典应用场景,具体操作如下:1.对于所有的左括号,进栈2.对于所有的右括号,弹出栈顶元素,判断是否与当前元素匹配,若不匹配,则returnfalse3.最后......
  • LeetCode --- 二叉树操作
    543. 二叉树的直径乍看是根节点的左子树最大高度+右子树最大高度+1但其实不能这样,因为路径可能并不经过根节点,如图二因此要用一个max来保存最后的最大路径和在求二叉树高度的递归中,在每个根节点(在递归函数中),比较max与以这个当前根节点的  左子树最大高度+右子......