703. 数据流中的第K大元素(简单)
703. 数据流中的第K大元素(简单)设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。
你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数据流中的初始元素。每次调用 KthLargest.add,返回当前数据流中第K大的元素。
示例:int k = 3;int[] arr = [4,5,8,2];KthLargest kthLargest = new KthLargest(3, arr);kthLargest.add(3); // returns 4kthLargest.add(5); // returns 5kthLargest.add(10); // returns 5kthLargest.add(9); // returns 8kthLargest.add(4); // returns 8
说明:你可以假设 nums 的长度≥ k-1 且k ≥ 1。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/kth-large ...
687. 最长同值路径(一般)
687. 最长同值路径(一般)给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
注意:两个节点之间的路径长度由它们之间的边数表示。
示例 1:输入: 5
/ \
4 5
/ \ \
1 1 5
输出:2
示例 2:输入: 1
/ \
4 5
/ \ \
4 4 5
输出:2注意: 给定的二叉树不超过10000个结点。 树的高度不超过1000。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-univalue-path
思路:
设计一个递归函数
递归函数的返回值
我们希望这个函数能够得到:从 node 节点开始,向下出发,最长的同值路径长度
因为路径的一个方向是通向 node 的父节点,所以另一个方向只能从 node 的左或右节点中选择至多一个
递归函数的出口
如果 node 为空,返回 ...
647. 回文子串(一般)
509. 斐波那契数/面试题10- I. 斐波那契数列(简单)给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。
示例 1:输入: "abc"输出: 3解释: 三个回文子串: "a", "b", "c".
示例 2:输入: "aaa"输出: 6说明: 6个回文子串: "a", "a", "a", "aa", "aa", "aaa".注意:
输入的字符串长度不会超过1000。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/palindromic-substrings
思路:和leetcode5思路一样,但是这里一个字母也算一个回文,其他没什么不同
代码1:1234567891011121314151617181 ...
617. 合并二叉树(简单)
617. 合并二叉树(简单)给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
示例 1:12345678910111213输入: 1 2 / \ / \ 3 2 1 3 / \ \ 5 4 7 Tree 1 ...
543. 二叉树的直径(简单)
543. 二叉树的直径(简单)给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
示例 :给定二叉树
1
/ \
2 3
/ \
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/diameter-of-binary-tree
思路:最大值不一定包含根节点,但是一定是:经过一个节点,该节点左右子树的最大深度之和 +1(二叉树的根节点深度为 0)于是,可以使用 DFS,找出所有节点的最大直径,在取出最大值 res;
定义一个全局变量 res,用来记录最大直径使用 dfs(root) 遍历所有的节点,dfs(root) 的作用是:找出以 root 为根节点的二叉树的最大深度
将根节点的深度定义为 1root 为跟节点的最大深度为 Math.max(leftDepth,rigthDepth) + 1res 取值 ...
538. 把二叉搜索树转换为累加树/1038. 从二叉搜索树到更大和树(简单)
538. 把二叉搜索树转换为累加树/1038. 从二叉搜索树到更大和树(简单)给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。
例如:
输入: 原始二叉搜索树: 5 / 2 13
输出: 转换为累加树: 18 / 20 13
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/convert-bst-to-greater-tree
思路:在递归方法中,我们维护一些递归调用过程中可以访问和修改的全局变量。首先我们判断当前访问的节点是否存在,如果存在就递归右子树,递归回来的时候更新总和和当前点的值,然后递归左子树。如果我们分别正确地递归 root.right 和 root.left ,那么我们就能正确地用大于某个节点的值去更新此节点,然后才遍历比它小的值。
作者: ...
437. 路径总和 III(简单)
437. 路径总和 III(简单)给定一个二叉树,它的每个结点都存放着一个整数值。
找出路径和等于给定数值的路径总数。
路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。
示例:root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8
10
/ \
5 -3
/ \ \
3 2 11
/ \ \
3 -2 1
返回 3。和等于 8 的路径有:
5 -> 3
5 -> 2 -> 1
-3 -> 11
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/path-sum-iii
思路:题目要求 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点) 。这就要求我们只需要去求三部分即可:
以当前节点作为头结点的路径 ...
402. 移掉K位数字(一般)
402. 移掉K位数字(一般)给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。
注意:num 的长度小于 10002 且 ≥ k。num 不会包含任何前导零。
示例 1 :输入: num = “1432219”, k = 3输出: “1219”解释: 移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219。
示例 2 :输入: num = “10200”, k = 1输出: “200”解释: 移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。
示例 3 :输入: num = “10”, k = 2输出: “0”解释: 从原数字移除所有的数字,剩余为空就是0。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/remove-k-digits
思路:栈+贪心算法
先举个例子436,我们要求只删除一个元素,所以我们有4,3,6三个元素进行选择,那么我们从3开始向右选择,3<4所以去掉4,因为不这样做,后面得到的,如43,46,都会比36大,永远不会得到最小数,这 ...
400. 第N个数字/面试题44. 数字序列中某一位的数字(一般)
400. 第N个数字/面试题44. 数字序列中某一位的数字(一般)在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …中找到第 n 个数字。
注意:n 是正数且在32位整数范围内 ( n < 231)。
示例 1:输入:3
输出:3
示例 2:输入:11
输出:0
说明:第11个数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是0,它是10的一部分。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/nth-digit
思路:找规律,n先减去个位的9个,再减去十位的90个,再减去百位900个数,保证不小于0,然后就可以确定在几位数中,还可以计算出余数,这样,计算量比暴力遍历好很多
代码:1234567891011121314151617181920class Solution { public int findNthDigit(int n) { //找规律,先找到数字,再找到数字中的值 in ...
347.前 K 个高频元素(简单)
347.前 K 个高频元素(简单)给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]
示例 2:输入: nums = [1], k = 1输出: [1]
提示:你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。你可以按任意顺序返回答案。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/top-k-frequent-elements
思路:
先用map进行统计
创一个最小堆,容量为k,遍历map
将堆输出即可
代码:1234567891011121314151617181920212223242526272829class Solution { public int[] topKFrequent(int[] nums, int k) ...