LeeCode 91双周赛复盘
T1: 不同的平均值数目
思路:排序 + 双指针 + 哈希存储
public int distinctAverages(int[] nums) {
Arrays.sort(nums);
Set<Double> set = new HashSet<>();
int i = 0, j = nums.length - 1;
while (i < j) {
double mid = (nums[i] + nums[j]) / 2.0;
if (!set.contains(mid)) {
set.add(mid);
}
i += 1;
j -= 1;
}
return set.size();
}
T2: 统计构造好字符串的方案数
思路:动态规划
状态定义:
dp[i]表示长度为i字符串的构造方案数初始状态:
dp[0] = 1表示空白字符串方案数为 1状态转移: \(dp[i] = (dp[i - zero] + dp[i - one]) \% MOD\)
public static final int MOD = 1000000007;
public int countGoodStrings(int low, int high, int zero, int one) {
int res = 0;
int[] dp = new int[high + 1];
dp[0] = 1;
for (int i = 1; i <= high; ++i) {
if (i >= zero) {
dp[i] = (dp[i] + dp[i - zero]) % MOD;
}
if (i >= one) {
dp[i] = (dp[i] + dp[i - one]) % MOD;
}
if (i >= low) {
res = (res + dp[i]) % MOD;
}
}
return res;
}
T3: 树上最大得分和路径
思路:两次DFS
第一次DFS,记录Bob经过每个点的时间
第二次DFS,记录Alice到每个叶节点,计算最大值
public int ans = Integer.MIN_VALUE;
public int mostProfitablePath(int[][] edges, int bob, int[] amount) {
// Build Tree
int n = amount.length;
List<Integer>[] tree = new List[n];
for (int i = 0; i < n; i++) {
tree[i] = new ArrayList<>();
}
for (int[] edge : edges) {
int x = edge[0];
int y = edge[1];
tree[x].add(y);
tree[y].add(x);
}
int[] bobTime = new int[n];
Arrays.fill(bobTime, n);
dfs_bob(tree, bobTime, bob, -1, 0);
// 区分根节点与叶子节点
tree[0].add(-1);
dfs_alice(tree, amount, bobTime, 0, -1, 0, 0);
return ans;
}
/**
*
* @param tree:树
* @param bobTime:bob路径上经过每个节点的时间数组
* @param cur:当前节点
* @param last:上一个节点
* @param t:当前时间
* @return
*/
public boolean dfs_bob(List<Integer>[] tree, int[] bobTime, int cur, int last, int t) {
if (cur == 0) {
bobTime[cur] = t;
return true;
}
for (int next : tree[cur]) {
// 可用顺利走到根节点的路径才标记
// next != last: 避免循环访问
if (next != last && dfs_bob(tree, bobTime, next, cur, t + 1)) {
bobTime[cur] = t;
return true;
}
}
return false;
}
/**
*
* @param tree: 树
* @param amount: 分值数组
* @param bobTime: bob路径上经过每个节点的时间数组
* @param cur: 当前节点
* @param last: 上一个节点
* @param t: 时间
* @param temp: 当前路径分值
*/
public void dfs_alice(List<Integer>[] tree, int[] amount, int[] bobTime, int cur, int last, int t, int temp) {
if (t < bobTime[cur]) {
temp += amount[cur];
}
else if (t == bobTime[cur]) {
temp += amount[cur] / 2;
}
// 到达叶节点
if (tree[cur].size() == 1) {
ans = Math.max(ans, temp);
return;
}
for (int next : tree[cur]) {
if (next != last) {
dfs_alice(tree, amount, bobTime, next, cur, t + 1, temp);
}
}
}
T4: 根据限制分割消息
思路:枚举分割个数 i,计算每个个数能容纳的字符总数,得到 message 需要的分割个数
public String[] splitMessage(String message, int limit) {
int n = message.length();
// 枚举分割个数 i, 计算其容量
int i = 1;
int cap = 0;
int tail_length = 0;
// cap >= n, 则说明该分割次数符合要求
while (true) {
if (i < 10) {
tail_length = 5;
}
else if (i < 100) {
if (i == 10) {
cap -= 9;
}
tail_length = 7;
}
else if (i < 1000) {
if (i == 100) {
cap -= 99;
}
tail_length = 9;
}
else {
if (i == 1000) {
cap -= 999;
}
tail_length = 11;
}
// tail长度大于等于limit, 则无法分割
if (tail_length >= limit) {
return new String[]{};
}
cap += limit - tail_length;
if (cap >= n) {
break;
}
i += 1;
}
String[] ans = new String[i];
int index = 0;
for (int j = 0; j < i; j++) {
String tail = "<" + (j + 1) + "/" + i + ">";
if (j == i - 1) {
ans[j] = message.substring(index) + tail;
}
else {
int len = limit - tail.length();
ans[j] = message.substring(index, index + len) + tail;
index += len;
}
}
return ans;
}
LeeCode 91双周赛复盘的更多相关文章
- leetcode 双周赛9 进击的骑士
一个坐标可以从 -infinity 延伸到 +infinity 的 无限大的 棋盘上,你的 骑士 驻扎在坐标为 [0, 0] 的方格里. 骑士的走法和中国象棋中的马相似,走 “日” 字:即先向左(或右 ...
- leetcode 双周赛9 找出所有行中最小公共元素
给你一个矩阵 mat,其中每一行的元素都已经按 递增 顺序排好了.请你帮忙找出在所有这些行中 最小的公共元素. 如果矩阵中没有这样的公共元素,就请返回 -1. 示例: 输入:mat = [[,,,,] ...
- LeetCode第8场双周赛(Java)
这次我只做对一题. 原因是题目返回值类型有误,写的是 String[] ,实际上应该返回 List<String> . 好吧,只能自认倒霉.就当涨涨经验. 5068. 前后拼接 解题思路 ...
- LeetCode 第 15 场双周赛
1287.有序数组中出现次数超过25%的元素 1288.删除被覆盖区间 1286.字母组合迭代器 1289.下降路径最小和 II 下降和不能只保留原数组中最小的两个,hacked. 1287.有序数组 ...
- LeetCode 第 14 场双周赛
基础的 api 还是不够熟悉啊 5112. 十六进制魔术数字 class Solution { public: char *lltoa(long long num, char *str, int ra ...
- leetcode-15双周赛-1286-字母组合迭代器
题目描述: 方法: class CombinationIterator: def __init__(self, characters: str, combinationLength: int): se ...
- leetcode-15双周赛-1287-有序数组中出现次数超过25%的元素
题目描述: 方法一:二分法 class Solution: def findSpecialInteger(self, arr: List[int]) -> int: span = len(arr ...
- leetcode-15双周赛-1288-删除被覆盖区间
题目描述: 方法一:排序O(Nlogn) class Solution: def removeCoveredIntervals(self, intervals: List[List[int]]) -& ...
- leetcode-15双周赛-1289-下降路径最小和
题目描述: 方法一:动态规划 O(N^3) class Solution: def minFallingPathSum(self, arr: List[List[int]]) -> int: n ...
- leetcode-第14周双周赛-1274-矩形内船只的数目
题目描述: 自己的提交: # """ # This is Sea's API interface. # You should not implement it, or s ...
随机推荐
- DTO的理解
首要的作用,我认为就是减少原生对象的多余参数.包括为了安全,有时候也为了节约流量.例如:密码,你就不能返回到前端.因为不安全. 其次假如说:获取博客列表的时候,也不能返回博客全文吧.顶多就返回标题,i ...
- 服务器端口对外开放(包括,mysql,django)
1.查看对外开放端口号,并开放端口 查看开放的端口 ,有两个命令 1.1.iptables -L -n (比较清晰明了) 1. 2.firewall-cmd --list-ports 1.3 .打开端 ...
- Mongodb+Stadio 3
一.安装Mongodb https://www.mongodb.com/download-center/community 请下载对应的系统 安装过程请不要选择 当所有的步骤值完成的时候,找到你的安 ...
- 2020.3.9 ~ 2020.3.15 ACM训练周总结
一.本周ACM学习相关内容 学习了dfs和bfs -- 4小时 课上系统的学习了vector等stl函数的使用即注意事项-3小时 二.题数与耗时 师哥安排了12道题,做了五道(不包含比赛题):大概4个 ...
- Rfost的自我介绍+软工五问
自我介绍+软工五问 问题 解答 这个作业属于哪个课程 网工1934-软件工程 这个作业要求在哪里 作业要求 这个作业的目标 让学生对软件工程有个初步的了解,同时掌握基础的markdown语法和博客园的 ...
- 鲁迅文集 第3卷 而已集 华盖集续编 华盖集 热风\四十一.md
目录 导读 正文 导读 本篇首次发表于1919年1月15日<新青年>第六卷第一号.署名唐俟. 文章以生物进化的事实,驳斥旧势力对改革者的嘲讽,号召青年蔑视反改革者的冷笑和暗箭,&quo ...
- ssh原理及应用
SSH原理与运用(一):远程登录 SSH原理与运用(一):远程登录 SSH原理与运用(二):远程操作与端口转发 SSH原理与运用(二):远程操作与端口转发 mitm应用: python开源三方库:ss ...
- P2962 [USACO09NOV]Lights G(Meet In The Middle)
[USACO09NOV]Lights G 题目描述 给出一张n个点n条边的无向图,每个点的初始状态都为0. 你可以操作任意一个点,操作结束后该点以及所有与该点相邻的点的状态都会改变,由0变成1或由1变 ...
- python和java语法对比
python java 不同的关键字 except,nolocal,as,assert,async,pass ,await,from,raise,global,in,del,with,lambda ...
- linux java 环境搭建
java -version 是否安装 yum -y remove java-1.7.0-openjdk* yum -y install java-1.7.0-openjdk* vim /etc/pro ...