持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情
前言
小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!
天堂硅谷·数字经济算法编程大赛
天堂硅谷·数字经济算法编程大赛-力扣
题目有点难,前两题简单,第三题不知道他每天简单的做法。第四题感觉可能是dfs或者是dp,不懂,不会做。
参加的人不多,排222(数字还挺吉利)不知道会不会联系我让我去实习(做梦吧),哈哈哈哈哈
这个女子高中生真厉害,搞不懂这些大佬是咋变成大佬的,真像也变成大佬
题目-01. 化学反应
实验室内有一些化学反应物,其中的任意两种反应物之间都能发生反应,且质量的消耗量为 1:1
已知初始 material[i] 表示第 i 种反应物的质量,每次进行实验时,会选出当前 质量最大 的两种反应物进行反应,假设反应物的重量分别为 i 和 j ,且 i <= j。反应的结果如下:
- 如果
i == j,那么两种化学反应物都将被消耗完; - 如果
i < j,那么质量为i的反应物将会完全消耗,而质量为j的反应物质量变为j - i。
最后,最多只会剩下一种反应物,返回此反应物的质量。如果没有反应物剩下,返回 0。
注意:
- 若链表为空,则返回空值。
示例 1
- 输入: [10,2,6,1]
- 输出: 1
- 解释:
- 先选出 10 和 6,得到 4,数组转换为 [4,2,1],
- 再选出 4 和 2,得到 2,数组转换为 [2,1],
- 最后选出 2 和 1,得到 1,最终数组转换为 [1],这就是最后剩下反应物的质量。
示例 2
- 输入: [6,4,10]
- 输出: 0
- 解释:
- 先选出 10 和 6,得到 4,所以数组转换为 [4,4],
- 再选出 4 和 4,得到 0,所以数组转换为 []
- 因为没有反应物剩下,返回 0。
提示
1 <= material.length <= 301 <= material[i] <= 1000
代码
这个题非常的眼熟,感觉在主站遇到过。
java写这个题挺简单的,用一个大顶堆,每次poll两个最大的出来,相减,如果等于零就不管了,否则再把结构add进去。直到里面只剩下一个或者没有元素,没有元素的话就返回0,只有一个的话就返回那个的值。
class Solution {
public int lastMaterial(int[] material) {
PriorityQueue<Integer> queue = new PriorityQueue<>((o1, o2) -> o2 - o1);
for (int i = 0; i < material.length; i++) {
queue.add(material[i]);
}
while (queue.size() > 1) {
int max = queue.poll();
int min = queue.poll();
if (max != min) {
queue.add(max - min);
}
}
if (queue.isEmpty()) {
return 0;
} else {
return queue.peek();
}
}
}
题目-02. 销售出色区间
给你一份销售数量表 sales,上面记录着某一位销售员每天成功推销的产品数目。
我们认为当销售员同一天推销的产品数目大于 8 个的时候,那么这一天就是「成功销售的一天」。
所谓「销售出色区间」,意味在这段时间内,「成功销售的天数」是严格 大于「未成功销售的天数」。
请你返回「销售出色区间」的最大长度。
示例 1
- 输入: sales = [10,2,1,4,3,9,6,9,9]
- 输出: 5
- 解释: 最大销售出色区间是 [3,9,6,9,9]。
示例 2
- 输入: sales = [5,6,7]
- 输出:
提示
1 <= sales.length <= 1040 <= sales[i] <= 16
代码
第二题基本也没什么难度,直接在原数组上修改,把大于8的置1,小于等于8的置0。
然后暴力就行了,这个好像必须得暴力了,当时没想到太好的方法。然后加一个剪枝,提前结束循环,可能会稍微快一点点。
class Solution {
public int longestESR(int[] sales) {
for (int i = 0; i < sales.length; i++) {
if (sales[i] > 8) {
sales[i] = 1;
} else {
sales[i] = 0;
}
}
int[] sum = new int[sales.length];
sum[0] = sales[0];
for (int i = 1; i < sales.length; i++) {
sum[i] = sales[i] + sum[i - 1];
}
int res = 0;
for (int i = 0; i < sales.length; i++) {
for (int j = i; j < sales.length; j++) {
if (res > j - i + 1) {
continue;
}
if (2*(sum[j] - sum[i] + sales[i])>j-i+1) {
res = Math.max(res,j - i + 1);
}
}
if (res > sales.length - i + 1) {
break;
}
}
return res;
}
}
果然还是有大佬用新的方法的,差了百倍的速度,算法还是y
第三题连接如下-题目-03. 重复的彩灯树
3.结束
前两题都不难,基本100题量的同学就可以做出来了,后面一个题我也瞎做的居然能过,不可思议。也没什么高深的算法,第四题就抓瞎了。gogogo,刷题刷题,每天一道,三年1000道!!!!