T1: 可被3整数的偶数的平均值

思路:数组遍历

被3整数的偶数 \(\Leftrightarrow\) 被6整数的数

public int averageValue(int[] nums) {
int sum = 0;
int count = 0;
for (int num : nums) {
if (num % 6 == 0) {
sum += num;
count += 1;
}
} if (count == 0) {
return 0;
} return sum / count;
}

T2: 最流行的视频创作者

思路:数组遍历 + 哈希

key: 对应创作者

value: 对应一个列表,list.get[0]表示创作者视频流量总和,list.get[1]表示创作者单个视频流量最大值,list.get[3] 表示创作者单个视频流量最大值对应的id

public List<List<String>> mostPopularCreator(String[] creators, String[] ids, int[] views) {
Map<String, List<String>> map = new HashMap<>(); long maxValue = 0;
for (int i = 0; i < creators.length; ++i) {
if (!map.containsKey(creators[i])) {
maxValue = Math.max(maxValue, views[i]);
List<String> list = new ArrayList<>();
list.add(String.valueOf(views[i]));
list.add(String.valueOf(views[i]));
list.add(ids[i]); map.put(creators[i], list);
}
else {
List<String> list = map.get(creators[i]); long sum = Long.valueOf(list.get(0));
int max = Integer.valueOf(list.get(1)); sum += views[i];
maxValue = Math.max(maxValue, sum);
if (max < views[i]) {
list.set(2, ids[i]);
max = views[i];
}
else if (max == views[i]) {
if (list.get(2).compareTo(ids[i]) > 0) {
list.set(2, ids[i]);
}
}
list.set(0, String.valueOf(sum)); // 总体流量总和
list.set(1, String.valueOf(max)); // 单个作者最大值 map.put(creators[i], list);
}
} List<List<String>> res = new ArrayList<>();
for (Map.Entry<String, List<String>> entry : map.entrySet()) {
String key = entry.getKey();
List<String> value = entry.getValue(); if (Long.valueOf(value.get(0)) == maxValue) {
List<String> temp = new ArrayList<>();
temp.add(key);
temp.add(value.get(2)); res.add(temp);
}
} return res;
}

T3: 美丽整数的最小增量

思路:贪心

  • 如果低位的值 value 不等于0,则使该为加上 10 - value 产生进位,从而减小数位和
  • 循环向高位贪心直至数位和满足小于等于 target 的要求
public long makeIntegerBeautiful(long n, int target) {
List<Integer> list = new ArrayList<>();
int bitSum = 0;
while (n > 0) {
int temp = (int) (n % 10);
n /= 10; bitSum += temp;
list.add(temp);
} if (bitSum <= target) {
return 0;
} int index = 0;
long ans = 0;
while (bitSum > target) {
int bit = list.get(index);
if (bit == 0) {
index += 1;
continue;
} ans = ans + (long) Math.pow(10, index) * (10 - bit);
index += 1; int temp = index; // 注意:如果左边第一位为9,会循环产生进位
while (temp < list.size() && list.get(temp) == 9) {
list.set(temp, 0);
bitSum -= 9;
temp += 1;
} if (temp == list.size()) {
list.add(1);
}
else {
list.set(temp, list.get(temp) + 1);
}
bitSum = bitSum - bit + 1;
} return ans;
}

T4: 移除子树后的二叉树高度

思路:深度优先搜索

  • 第一次深度优先搜索:计算每个节点的高度值
  • 第二次深度优先搜索:计算去除当前节点为根是子树后,剩余子树的高度值
private Map<TreeNode, Integer> map = new HashMap<>();
private int[] res;
public int[] treeQueries(TreeNode root, int[] queries) {
dfs(root);
map.put(null, 0); res = new int[map.size() + 1];
dfs2(root, -1, 0); for (int i = 0; i < queries.length; ++i) {
queries[i] = res[queries[i]];
} return queries;
} /**
* 第一次DFS: 获取每个节点的高度
* @param node
* @return
*/
private int dfs(TreeNode node) {
if (node == null) {
return 0;
} int height = 1 + Math.max(dfs(node.left), dfs(node.right));
map.put(node, height); return height;
} /**
* 第二次DFS: 删除以当前节点为根的子树后, 剩余子树的最大高度
* @param node: 当前节点
* @param height: 当前节点高度
* @param residue: 去除以当前节点为根的子树的高度
*/
private void dfs2(TreeNode node, int height, int residue) {
if (node == null) {
return;
} height += 1;
res[node.val] = residue; dfs2(node.left, height, Math.max(residue, height + map.get(node.right)));
dfs2(node.right, height, Math.max(residue, height + map.get(node.left)));
}

总结

  • 前3题完成的都挺顺利
  • 第4题思路能想到是 DFS,但是自己每次不同的 query 都去深搜导致超时,没能想到第一遍深搜统计高度值,第二遍深搜计算答案

LeeCode 317周赛复盘的更多相关文章

  1. leecode系列--Two Sum

    学习这件事在任何时间都不能停下.准备坚持刷leecode来提高自己,也会把自己的解答过程记录下来,希望能进步. Two Sum Given an array of integers, return i ...

  2. [codeforces 317]A. Perfect Pair

    [codeforces 317]A. Perfect Pair 试题描述 Let us call a pair of integer numbers m-perfect, if at least on ...

  3. 周赛-KIDx's Pagination 分类: 比赛 2015-08-02 08:23 7人阅读 评论(0) 收藏

    KIDx's Pagination Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) S ...

  4. Win8制作和使用恢复盘

    制作和使用恢复盘要制作恢复盘,请执行以下操作:注:确保计算机连接到交流电源.1. 将指针移至屏幕的右上角或右下角以显示超级按钮,然后单击搜索.2. 根据操作系统的不同,执行以下某项操作:• 在 Win ...

  5. insertion Sort List (链表的插入排序) leecode java

    逻辑简单,代码难写,基础不劳,leecode写注释不能出现中文,太麻烦,我写了大量注释,链表问题最重要的就是你那个指针式干啥的 提交地址https://oj.leetcode.com/problems ...

  6. 后续遍历 java leecode

    以前觉得后续遍历最难写,今天看了篇博客http://blog.csdn.net/sgbfblog/article/details/7773103,其实却是我们仔细比较后续遍历和先序遍历,其实后续遍历就 ...

  7. 非递归实现先序遍历 java leecode 提交

    写完才知道自己学习都是似是而非啊,大家可以也在leecode上提交代码,纯手写,离开eclipse第一种方式:数据结构书上的,使用栈大概思路.1.不断将根节点的左孩子的左孩子直到为空,在这个过程入栈. ...

  8. leecode 归并排序 链表(java)

    写了好久,终于写成了.第一次zai leecode错题,题目质量很高,适合面试,与 1.归并排序是稳定的,在java中 Arrays.sort(a);中对于对象的排序就是归并排序.对于原子类型数据使用 ...

  9. bug修复复盘

    mybatis与数据库交互时,报了莫名其妙的错,日志中显示的Stack Trace中报错的代码行数与IDE中还一致,逐重启tomcat,异常消失. 故障复盘:没有重启tomcat,使用copy命令直接 ...

  10. uva 317 - Hexagon(规律推导)

    题目连接:317 - Hexagon 题目大意:在一个19个六边形组成的图形上玩一个游戏,给出9个数字, 分成3组, 分别可以填在左上角, 上, 有上角,因为对于小六边形来说, 对边的数是相同的, 然 ...

随机推荐

  1. flink 启动job命令

    0. 启动flink-session ./bin/yarn-session.sh -n 4 -s 3 -jm 2048 -tm 6144 高版本 bin/yarn-session.sh -d -s 3 ...

  2. Android 自定义View (二)

    一.前言 上节 通过一个简单的旋转环对自定义view作了一个基本的认识,本文将大致讲解下实现的思路以及对该view的一些可能的改进. 二.思路 主要通过重写 view 中的 onDraw() 方法,利 ...

  3. __declspec(dllimport) 和 __declspec(dllexport)的使用详解、以及 XX_API 的含义

    1. C++代码里调用别人的库.或者写库给别人用.大概有如下的方法(只讨论windows系统的情况): ---- a) 提供头文件 h . 静态库 lib  -- > 静态链接 ---- b) ...

  4. nginx按天输出日志

    直接在nginx配置文件中,配置日志循环,而不需使用logrotate或配置cron任务.需要使用到$time_iso8601 内嵌变量来获取时间.$time_iso8601格式如下:2015-08- ...

  5. Xamarin.Android 利用作业计划程序实现ImageSwitcher图片自动定时轮播

    在开发android程序时,遇到一个问题,ImageSwitcher只支持手动的切换图片,不支持自动定时的切换.因为xamarin的资料很少,官方也没有相应的教程,所以想到这个方法,利用job程序来实 ...

  6. 远程云服务器上docker安装redis的过程

    首先明确一点,云服务环境你已经安装好了docker 1.进入docker hub官网查看你所需要的redis的版本信息 https://registry.hub.docker.com/

  7. NOIP2021 T1 报数 题解

    AFO了,来最后写一波题解. T1 不算阴间,题意很直白,所以想先顺着题意打一波模拟. 算一下,发现 1e7 的 $O(nlog(n))$ 时间复杂度好像可以直接过( 实际上是$O(nloglog(n ...

  8. @Valid 注解类型参数校验

    <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api& ...

  9. Javaweb学习笔记第六弹

    本章节的存在意义是:学到PreparedStatement反应较慢,理解不透彻,来做个比较,加深印象 详细讲述PrepareStatement 与 Statement 连接数据库的部分区别 在我学习的 ...

  10. 在CentOS中搭建NFS

    概述 NFS是一款经典的网络文件系统,在Linux上我们可以通过创建一个NFS服务在不同的服务器之间共享磁盘文件,而不用在多个服务器之间进行不断的拷贝复制,麻烦且浪费存储空间.在k8s中我们也可以使用 ...