[杨小白]_leetcode_天堂硅谷·数字经济算法编程大赛-第一、二题

213 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

前言

小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!

天堂硅谷·数字经济算法编程大赛

天堂硅谷·数字经济算法编程大赛-力扣

题目有点难,前两题简单,第三题不知道他每天简单的做法。第四题感觉可能是dfs或者是dp,不懂,不会做。

参加的人不多,排222(数字还挺吉利)不知道会不会联系我让我去实习(做梦吧),哈哈哈哈哈

image.png

这个女子高中生真厉害,搞不懂这些大佬是咋变成大佬的,真像也变成大佬

题目-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 <= 30
  • 1 <= 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();
        }
    }
}

image.png

题目-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 <= 104
  • 0 <= 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;
    }
}

image.png

果然还是有大佬用新的方法的,差了百倍的速度,算法还是y

第三题连接如下-题目-03. 重复的彩灯树

3.结束

前两题都不难,基本100题量的同学就可以做出来了,后面一个题我也瞎做的居然能过,不可思议。也没什么高深的算法,第四题就抓瞎了。gogogo,刷题刷题,每天一道,三年1000道!!!!