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 ...
随机推荐
- 执行helm list 提示kube/config 告警问题
1.现象 WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.ku ...
- Thread的状态变更
[需注意的是:运行中(Running)和就绪(Ready)并不是 Java 的线程状态] public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TI ...
- vue 项目页面刷新router-view控制
vue项目开发过程中,需要在页面提交表单信息之后清空还原,即恢复页面初始状态,第一想法就是对当前页面刷新,重新加载. 想起location.reload()方式和this.$router.go(0)方 ...
- Java数据类型基础
Java 数据类型基础 数据类型 强类型语言 要求变量的使用要严格符合规定,所有变量必须先定义后使用 Java数据分为两大类 基本类型(primitive type) 数值类型 整数类型 byte(1 ...
- HOOK大法
// 请求头hook 测试网站同花顺 OK var header_old = window.XMLHttpRequest.prototype.setRequestHeader;window.XMLHt ...
- nRF52832出现“APP_UART_COMMUNICATION_ERROR”的错误的问题
在调试nRF52832的uart的过程中,发现调试信息会时不时打印"APP_UART_COMMUNICATION_ERROR"这个错误,看上去似乎毫无规律.查看SDK的相关说明,可 ...
- Spyglass CDC工具使用(五)
最近一直在搞CDC (clock domain crossing) 方面的事情,现在就CDC的一些知识点进行总结. 做CDC检查使用的是Spyglass工具.以下内容转载自:Spyglass之CDC检 ...
- consul 服务注册与更新
服务注册与发现是微服务架构中不可或缺的重要组件. 起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的通过接口访问.直到后来出现了多个节点的分布式架构,起初的解决手段是在服 ...
- Chrome(谷歌)浏览器永久关闭恢复页面提示框(记录)
使用脚本调用Chrome浏览器启动指定页面,然后代码里的命令关闭,会被浏览器识别为非正常关闭. 再次执行脚本的时候会停留在空白页面,无法进入指定页面,设置为主页也无法进入. 排查可能是浏览器自动恢复页 ...
- CH573 CH582 CH579蓝牙从机(peripheral)例程讲解二(广播内容修改)
在上一篇外设例程讲解中讲述了蓝牙从机的收发接口,这样可以快速的上手,那么接下来就讲解另一个重要设置,从机的广播. 在peripheral例程中,一直是以50ms的周期进行广播,使用手机软件扫描可以获取 ...