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双周赛复盘的更多相关文章

  1. leetcode 双周赛9 进击的骑士

    一个坐标可以从 -infinity 延伸到 +infinity 的 无限大的 棋盘上,你的 骑士 驻扎在坐标为 [0, 0] 的方格里. 骑士的走法和中国象棋中的马相似,走 “日” 字:即先向左(或右 ...

  2. leetcode 双周赛9 找出所有行中最小公共元素

    给你一个矩阵 mat,其中每一行的元素都已经按 递增 顺序排好了.请你帮忙找出在所有这些行中 最小的公共元素. 如果矩阵中没有这样的公共元素,就请返回 -1. 示例: 输入:mat = [[,,,,] ...

  3. LeetCode第8场双周赛(Java)

    这次我只做对一题. 原因是题目返回值类型有误,写的是 String[] ,实际上应该返回 List<String> . 好吧,只能自认倒霉.就当涨涨经验. 5068. 前后拼接 解题思路 ...

  4. LeetCode 第 15 场双周赛

    1287.有序数组中出现次数超过25%的元素 1288.删除被覆盖区间 1286.字母组合迭代器 1289.下降路径最小和 II 下降和不能只保留原数组中最小的两个,hacked. 1287.有序数组 ...

  5. LeetCode 第 14 场双周赛

    基础的 api 还是不够熟悉啊 5112. 十六进制魔术数字 class Solution { public: char *lltoa(long long num, char *str, int ra ...

  6. leetcode-15双周赛-1286-字母组合迭代器

    题目描述: 方法: class CombinationIterator: def __init__(self, characters: str, combinationLength: int): se ...

  7. leetcode-15双周赛-1287-有序数组中出现次数超过25%的元素

    题目描述: 方法一:二分法 class Solution: def findSpecialInteger(self, arr: List[int]) -> int: span = len(arr ...

  8. leetcode-15双周赛-1288-删除被覆盖区间

    题目描述: 方法一:排序O(Nlogn) class Solution: def removeCoveredIntervals(self, intervals: List[List[int]]) -& ...

  9. leetcode-15双周赛-1289-下降路径最小和

    题目描述: 方法一:动态规划 O(N^3) class Solution: def minFallingPathSum(self, arr: List[List[int]]) -> int: n ...

  10. leetcode-第14周双周赛-1274-矩形内船只的数目

    题目描述: 自己的提交: # """ # This is Sea's API interface. # You should not implement it, or s ...

随机推荐

  1. curl 查看响应时间

    curl -o /dev/null -s -w "time_namelookup:%{time_namelookup}\ntime_connect: %{time_connect}\ntim ...

  2. ABAP开发面向对象---类

    今日学习ABAP面向对象里面的类,关于构造,继承,实现. 踩坑点:类有抽象的方法,类本身也需要是抽象的,故需要在类申明里面加上ABSTRACT关键字 学习资料为B站翱翔云天老师的 1 CLASS zc ...

  3. node.js与js的关系

  4. Java的流程控制

    Scanner对象 next(); 一定要读取到有效字符后才可以结束输入. 对输入有效字符之前遇到的空白,next()方法会自动将其去掉(). 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束 ...

  5. requests模块获取cookie -----class 'requests.cookies.RequestsCookieJar'

    #coding=utf-8 import requests url="http://www.baidu.com" response=requests.get(url) cookie ...

  6. JAVA 学习打卡 day3

    2022-04-25 22:53:16 1.运算符 表达式是由操作数与运算符所组成Java中的语句有很多种形式,表达式就是其中一种形式.表达式是由操作数与运算符所组成,操作数可以是常量.变量也可以是方 ...

  7. 持续集成环境(6)-Tomcat安装和配置(编写中)

    安装Tomcat8.5 把Tomcat压缩包上传到tomcat服务器(tomcat专用服务测试服务器.生产服务器) yum install java-1.8.0-openjdk* -y wget ht ...

  8. termux搭建服务器方式

    pkg install vim apt update 安装debian系统apt install proot-distroproot-distro install debianproot-distro ...

  9. restfull风格传参

  10. 深入理解css 笔记(6)

    网格布局:flexbox 彻底改变了网页布局方式,但这只是开始.它还有一个大哥:另一个称作网格布局模块的新规范.这两个规范提供了一种前所未有的全功能布局引擎.跟 flexbox 类似,网格布局也是作用 ...