文章

每日LeetCode 234-236

2021.10.5 ・ 共 801 字,您可能需要 2 分钟阅读

Tags: LeetCode

给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。

进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1)的算法解决此问题。

示例 1:

输入:[3,2,3] 输出:[3]

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/majority-element-ii 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
    public List<Integer> majorityElement(int[] nums) {
        List<Integer> ans = new ArrayList<>();
        int a = nums[0];
        int b = a;
        int countA = 0;
        int countB = 0;
        for (int num : nums) {
            if (num == a) {
                countA++;
                continue;
            }

            if (num == b) {
                countB++;
                continue;
            }

            if (countA == 0) {
                a = num;
                countA = 1;
                continue;
            }

            if (countB == 0) {
                b = num;
                countB = 1;
                continue;
            }

            countA--;
            countB--;
        }
        countA = 0;
        countB = 0;
        for (int num : nums) {
            if (num == a) {
                countA++;
            }

            if (num == b) {
                countB++;
            }
        }

        if (countA > nums.length / 3) {
            ans.add(a);
        }
        if (a != b && countB > nums.length / 3) {
            ans.add(b);
        }
        return ans;
    }
}

摩尔投票,两两抵抗

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。

class Solution {
    public int kthSmallest(TreeNode root, int k) {
        Deque<TreeNode> stack = new LinkedList<>();
        while (true) {
            while (root != null) {
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();
            k--;
            if (k == 0) {
                return root.val;
            }
            root = root.right;
        }

    }
}

二叉搜索树的中序遍历是递增序列,每次进行比对K即可。

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
    TreeNode ans;
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        dfs(root, p, q);
        return ans;
    }

    public boolean dfs(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null) {
            return false;
        }
        // 左子树是否含有 p 或 q
        boolean l = dfs(root.left, p, q);
        // 右子树是否含有 p 或 q
        boolean r = dfs(root.right, p, q);
        if ((l && r) || ((l || r) && (root == p || root == q))) {
            ans = root;
        }
        return l || r || (root == p || root == q);
    }
}