LeetCode 2021 春季赛

简介: LeetCode 2021 春季赛

1. 采购方案

小力将 N 个零件的报价存于数组 nums。小力预算为 target,假定小力仅购买两个零件,要求购买零件的花费不超过预算,请问他有多少种采购方案。

注意:答案需要以 1e9 + 7 (1000000007) 为底取模,如:计算初始结果为:1000000008,请返回 1

示例 1:

输入:nums = [2,5,3,5], target = 6

输出:1

解释:预算内仅能购买 nums[0] 与 nums[2]。

示例 2:

输入:nums = [2,2,1,9], target = 10

输出:4

解释:符合预算的采购方案如下:

nums[0] + nums[1] = 4

nums[0] + nums[2] = 3

nums[1] + nums[2] = 3

nums[2] + nums[3] = 10

提示:

  • 2 <= nums.length <= 10^5
  • 1 <= nums[i], target <= 10^5

思路:


image.png

整体代码如下:

public class Solution{
    public int purchasePlans(int[] nums, int target) {
        Arrays.sort(nums);
        int r = nums.length - 1;
        long res = 0;
        int mod = (int) 1e9 + 7;
        for (int l = 0; l < r; l++) {
            while (r > l && nums[l] + nums[r] > target) {
                r--;
            }
            res = (res + r - l) % mod;
        }
        return (int) res;
    }
}

3. 魔塔游戏

小扣当前位于魔塔游戏第一层,共有 N 个房间,编号为 0 ~ N-1。每个房间的补血道具/怪物对于血量影响记于数组 nums,其中正数表示道具补血数值,即血量增加对应数值;负数表示怪物造成伤害值,即血量减少对应数值;0 表示房间对血量无影响。

小扣初始血量为 1,且无上限。假定小扣原计划按房间编号升序访问所有房间补血/打怪,为保证血量始终为正值,小扣需对房间访问顺序进行调整,每次仅能将一个怪物房间(负数的房间)调整至访问顺序末尾。请返回小扣最少需要调整几次,才能顺利访问所有房间。若调整顺序也无法访问完全部房间,请返回 -1。

示例 1:

输入:nums = [100,100,100,-250,-60,-140,-50,-50,100,150]

输出:1

解释:初始血量为 1。至少需要将 nums[3] 调整至访问顺序末尾以满足要求。

示例 2:

输入:nums = [-200,-300,400,0]

输出:-1

解释:调整访问顺序也无法完成全部房间的访问。

提示:

  • 1 <= nums.length <= 10^5
  • -10^5 <= nums[i] <= 10^5

思考:

这个题可以考虑用贪心的做法来做:

对于每一个怪物房间,可以考虑首先将当前使得血量总值不满足正数的且绝对值最大的放到最后,这样子调整的次数会是最少的,证明如下:

image.png

考虑到了需要用优先队列来维护怪物造成伤害值的值,因此需要借助PriorityQueue,注意是从大到小排序,存进去的顺序是怪物造成伤害值的绝对值。

res来记录调整的次数,last变量来维护每次调整到最后的一个怪物伤害值大小的绝对值的和,来与前面所有调整后血量还不为0的血量总和sum来进行比较,如果调整后的所有伤害值大小last比一直增加的血量和sum要大,则说明无论如何调整都不可能满足题目条件,否则输出res

class Solution {
    public int magicTower(int[] nums) {
        int len = nums.length;
        long last = 0;
        long sum = 1;
        int res = 0;
        PriorityQueue<Integer> q = new PriorityQueue<>((x,y) -> y - x);
        for (int i = 0; i < len; i++) {
            if (nums[i] >= 0) {
                sum += nums[i];
            } else {
                q.add(-nums[i]);
                if (-nums[i] > sum) {
                    int poll = q.poll();
                    res++;
                    sum += poll;
                    last += poll;
                }
                sum += nums[i];
            }
        }
        if (sum <= last) {
            return -1;
        }
        return res;
    }
}


相关文章
|
4月前
|
容器
天梯赛备战(三)
天梯赛备战(三)
|
4月前
|
机器学习/深度学习
【周赛总结】双周赛109
【周赛总结】双周赛109
31 0
|
4月前
【周赛总结】17-双周赛108
【周赛总结】17-双周赛108
31 0
【Leetcode】- 第 29 场双周赛
【Leetcode】- 第 29 场双周赛
|
4月前
|
存储 iOS开发 容器
天梯赛备战(二)
天梯赛备战(二)
|
4月前
|
存储 编译器 C++
天梯赛备战(一)c++
天梯赛备战(一)c++
|
11月前
|
存储 数据安全/隐私保护
|
11月前
|
存储 容器
|
机器学习/深度学习 人工智能 算法
LeetCode 双周赛 99,纯纯送分场!
昨晚是 LeetCode 第 99 场双周赛,你参加了吗?这场周赛整体难度很低,第 4 题评论区普遍认为是 1 字头,纯纯手速场。
105 0
|
并行计算 Java 调度
leetcode第84场双周赛
维护一个unordered_map mp,mp[x]表示类型x的任务最近一次的结束时间。按顺序枚举所有任务,设当前任务类型为。从倒数第二个数开始往前考虑。,执行当前任务之前已经经过了。是有序的,直接把遍历。的结果作为答案即可。把等式两边移项,变为。
73 0
leetcode第84场双周赛