当前位置: 首页 > news >正文

Leetcode2300. 咒语和药水的成功对数

Every day a Leetcode

题目来源:2300. 咒语和药水的成功对数

解法1:暴力

代码:

class Solution
{
public:
    vector<int> successfulPairs(vector<int> &spells, vector<int> &potions, long long success)
    {
        int n = spells.size(), m = potions.size();
        vector<int> pairs(n, 0);
        for (int i = 0; i < n; i++)
        {
            int count = 0;
            for (const int &potion : potions)
                if ((long long)spells[i] * potion >= success)
                    count++;
            pairs[i] = count;
        }
        return pairs;
    }
};

结果:超时。

复杂度分析:

时间复杂度:O(n * m),其中 n 是数组 spells 的长度,m 是数组 potions 的长度。

空间复杂度:O(1)。

解法2:二分查找

对于某一个咒语的能量,我们可以采用二分查找的方法来高效地找到符合条件的药水数量。

首先,我们将 potions 数组进行排序,以便能够利用有序性进行二分查找。然后,对于每个咒语 spells[i],我们计算出目标值 target = ceil(1.0 * success / spells[i]),代表了在当前咒语强度下,药水需要达到的最低强度。接下来,我们使用「二分查找」来在数组 potions 中找到第一个大于等于 target 的元素的索引 index,进一步可以得到此时表示成功组合的药水数量为 m − index,其中 m 表示数组 potions 的长度。

代码:

class Solution
{
public:
    vector<int> successfulPairs(vector<int> &spells, vector<int> &potions, long long success)
    {
        int n = spells.size(), m = potions.size();
        vector<int> pairs(n, 0);
        sort(potions.begin(), potions.end());
        for (int i = 0; i < n; i++)
        {
            long long target = ceil(1.0 * success / spells[i]);
            int left = 0, right = m - 1;
            while (left <= right)
            {
                int mid = (left + right) / 2;
                if ((long long)spells[i] * potions[mid] >= success)
                    right = mid - 1;
                else
                    left = mid + 1;
            }
            pairs[i] = m - left;
        }
        return pairs;
    }
};

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(m * logm + n * logm),其中 n 是数组 spells 的长度,m 是数组 potions 的长度。排序的时间复杂度为 O(m * logm),一次二分查找的时间复杂度为 O(logm),共 n 次,所有二分查找的总的时间复杂度为 O(n * logm)。

空间复杂度:O(logm),其中 m 是数组 potions 的长度

相关文章:

  • 适合汽车音频系统的ADAU1977WBCPZ、ADAU1978WBCPZ、ADAU1979WBCPZ四通道 ADC,24-bit,音频
  • 企业安全—三保一评
  • 解决弹窗滚动穿透
  • 整理笔记——稳压直流电路知识
  • 【Kurbernetes部署】知识点总结(部署方式、网络插件.....)
  • C++类和对象(上)
  • JVM在线分析-解决问题的工具一(jinfo,jmap,jstack)
  • 8-2、T型加减速计算简化【51单片机控制步进电机-TB6600系列】
  • 华为认证 | 11月底这门HCIP认证即将发布!
  • 数据库常见面试题 —— 12. SQL 如何优化才能解决数据倾斜类问题
  • 拆分代码 + 动态加载 + 预加载,减少首屏资源,提升首屏性能及应用体验
  • vue3 自动导入composition-apiI和组件
  • Linux 学习(CentOS 7)
  • 【常用算法】java实现的三种分页算法
  • Python机器学习算法入门教程(第四部分)
  • MVCC中的可见性算法
  • 苹果Ios系统app应用程序开发者如何获取IPA文件签名证书时需要注意什么?
  • React Hooks为什么要在顶层使用?
  • 【go-zero】go-zero 脚手架 simple-admin 第二章:通过goctls生成api整个项目
  • 【公益案例展】火山引擎公益电子票据服务——连接善意,共创美好
  • 一周观展|一批重量级考古博物馆开馆:从凌家滩看到孙吴大墓
  • 特写|银耳种植“北移”到沧州盐山,村民入伙可年增收4万元
  • 摄影师|伊莎贝尔·穆尼奥斯:沿着身体进行文化溯源
  • 中国情怀:时代记录与家国镜相|澎湃·镜相第三届非虚构写作大赛征稿启事
  • “16+8”“生酮饮食”,网红减肥法究竟靠谱吗?
  • 【社论】打破“隐形高墙”,让老年人更好融入社会