8月算法训练------第八天(前缀和)解题报告
题目类型:前缀和
题目难度:中等
第一题、1838. 最高频元素的频数
-
题目链接:1838. 最高频元素的频数
-
思路分析:
-
代码:
class Solution {
public int maxFrequency(int[] nums, int k) {
Arrays.sort(nums);
int n = nums.length;
long total = 0;
int l = 0, res = 1;
for (int r = 1; r < n; ++r) {
total += (long) (nums[r] - nums[r - 1]) * (r - l);
while (total > k) {
total -= nums[r] - nums[l];
++l;
}
res = Math.max(res, r - l + 1);
}
return res;
}
}
第二题、剑指 Offer 55 - I. 二叉树的深度
- 题目链接:剑指 Offer 55 - I. 二叉树的深度
- 思路分析:
深度优先遍历,遍历到当前节点时,将深度加1,对于其左右节点,返回左右当中值最大的。 - 代码:
class Solution {
public int maxDepth(TreeNode root) {
return dfs(root, 1);
}
public int dfs(TreeNode root, int depth){
if(root == null){
return depth - 1;
}
depth++;
int max = Math.max(dfs(root.left, depth), dfs(root.right, depth));
return max;
}
}
第三题、剑指 Offer 55 - II. 平衡二叉树
- 题目链接:剑指 Offer 55 - II. 平衡二叉树
- 思路分析:
从顶到底遍历,判断当前节点是否为平衡二叉树,判断依据就是左右节点的深度差值小于等于1。 - 代码:
class Solution {
public boolean isBalanced(TreeNode root) {
if (root == null) {
return true;
} else {
return Math.abs(height(root.left) - height(root.right)) <= 1 && isBalanced(root.left) && isBalanced(root.right);
}
}
public int height(TreeNode root) {
if (root == null) {
return 0;
} else {
return Math.max(height(root.left), height(root.right)) + 1;
}
}
}